OpenGL转换

时间:2012-02-17 13:21:05

标签: c++ opengl

我在一个点上有一个物体,比如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>

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

2 个答案:

答案 0 :(得分:13)

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

我们有一个向量X = (x,y,z,1)。我希望你知道如何multiply matrixes。让我们说你要翻译你的观点 V = (vx,vy,vz)。 要做到这一点,你需要像这样构建translation matrix

Translation matrix

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

Translation via matrix

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

Rotation matrices

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

  • 翻译T1
  • 旋转R1
  • 翻译T2

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

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

请注意,矩阵乘法不是commutative所以顺序无关紧要

OpenGL在内部使用这些矩阵(还有更多类型,如scale matrix)。您可以使用命令获取当前转换矩阵(例如来自here):

glGetDoublev(GL_MODELVIEW_MATRIX, redTransformationMatrix);

以下是如何正确表示这些数据(详细信息here):

enter image description here

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

答案 1 :(得分:3)

您可以使用glGetDoublev

从OpenGL状态检索矩阵
GLdouble projectionMatrix[16];
glGetDoublev(GL_PROJECTION, projectionMatrix);

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

另请注意,当您先翻译然后再旋转时,您也会旋转平移向量。 通常,您在原点中旋转对象然后进行平移,从而在平移终点处生成旋转对象。

编辑:要获取转换后的坐标 p',您需要使用这些矩阵转换 p 点:

p' = projectionMatrix * modelViewMatrix * p

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