OpenGL 转换

Posted

技术标签:

【中文标题】OpenGL 转换【英文标题】:OpenGL transformations 【发布时间】:2012-02-17 13:21:04 【问题描述】:

我在某个点有一个对象,例如相对于原点的 x,y,z。 我想对该点应用一些变换,比如旋转和平移,并在变换点处渲染对象。我正在使用glTranslatef()glRotatef() 函数。它看起来像这样:

glTranslatef(x,y,z); 
glRotatef(Ang,0,1,0); // rotated around Y axis at an arbitrary angle
glTranslatef(xt,yt,zt); // further translation
<render the object>

尽管它使我免于复杂的矩阵变换操作,但我不知道最终位置相对于原点的实际坐标值。有没有一种方法可以在不经过矩阵运算的情况下检索变换点的实际位置坐标?

【问题讨论】:

您想做什么 - 在给定坐标处绘制对象,或者像您的示例中那样绘制它,但不知何故知道它在哪里结束? 我需要在变换后的位置绘制一个对象,并知道变换后的坐标,以便计算.. @flopcoder 为什么你撤消了我的大部分编辑,将更正的问题引入问题中?例如,它是 OpenGL,而不是 OpenGL @Bart 哎呀,我们正在同时编辑这个,我没有编辑那个。我没有编辑权限,所以我的编辑处于待处理状态。 @FlopCoder 啊,这可以解释。我会更新 【参考方案1】:

我先给你一些理论。 OpenGL 使用矩阵4x4 和长度为4(3D)的向量(点坐标)。

让我们有一个向量X = (x,y,z,1)。我希望你知道如何multiply matrixes。假设您想通过以下方式翻译您的观点 V = (v<sub>x</sub>,v<sub>y</sub>,v<sub>z</sub>)。 为此,您需要像这样构建translation matrix:

您将乘以两个矩阵(矩阵 * 向量/点):Y = TX:

这样做如此复杂(而不仅仅是添加X + V)的原因是您可以通过用不同的值填充相同的矩阵来围绕轴旋转您的点。它被称为rotation matrix:

最好的部分是您可以链接这些矩阵。当你需要用这些规则画点时:

翻译T<sub>1</sub> 旋转R<sub>1</sub> 翻译T<sub>2</sub>

您可以准备一个矩阵来一次性完成所有工作: F = T1R1T2

然后立即将所有这些转换应用于该点:Y = FX

请注意,矩阵乘法不是commutative,所以顺序很重要

OpenGL 可以在内部使用这些矩阵(像scale matrix 这样的类型很少)。您可以通过命令获取当前的变换矩阵(示例来自here):

glGetDoublev(GL_MODELVIEW_MATRIX, redTransformationMatrix);

以下是正确表示这些数据的方法(详细信息here):

除最后一张外的所有图片均来自wikipedia.org

【讨论】:

【参考方案2】:

您可以使用 glGetDoublev 从 OpenGL 状态中检索矩阵:

GLdouble projectionMatrix[16];
glGetDoublev(GL_PROJECTION, projectionMatrix);

GLdouble modelViewMatrix[16];
glGetDoublev(GL_MODELVIEW, modelViewMatrix);

还请注意,当您先平移然后旋转时,您也在旋转平移向量。 通常,您在原点旋转对象然后平移它,从而在平移终点产生旋转的对象。

编辑:要获得变换后的坐标p',您需要使用这些矩阵变换一个点p

p' = projectionMatrix * modelViewMatrix * p

我建议使用glm 进行此类操作。

【讨论】:

以上是关于OpenGL 转换的主要内容,如果未能解决你的问题,请参考以下文章

OpenGl 坐标转换

将 OpenGL 绘制列表转换为顶点数组或 VBO

从视口坐标转换为 [-1,1]^2 顶点 [OpenGL]

OpenGL转换不使用GLM矩阵

OpenGL工作流程

OpenGL 转换