OpenGL变换

3

我有一个位于某一点(例如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>

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


你想要做什么——在给定的坐标上绘制对象,还是像你的示例一样绘制,但知道它最终会在哪里? - Ivaylo Strandjev
我需要在变换后的位置上绘制一个对象,并且获取变换后的坐标,以便进行计算。 - itsraining
@flopcoder 为什么你撤销了我大部分的编辑,把修正后的问题重新引入到问题中?例如,它是OpenGL,而不是OpenGl。 - Bart
@Bart 哎呀,我们同时在编辑,我没有编辑权限,所以我的编辑正在等待中。 - Sufian Latif
@FlopCoder 啊,这可能就解释了。我会更新的。 - Bart
2个回答

13

首先,我会给你一些理论知识。OpenGL使用矩阵4x4和长度为4的向量(点坐标)来工作(在3D中)。

让我们有一个向量X = (x,y,z,1)。我希望你知道如何矩阵相乘。假设你想通过V = (vx,vy,vz)来平移你的点。为了做到这一点,你需要构建平移矩阵,像这样:

Translation matrix

你将要对两个矩阵进行乘法计算(矩阵 * 向量/点): Y = TX:

Translation via matrix

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

Rotation matrices

最好的部分是您可以链接这些矩阵。当您需要按照以下规则绘制点时:

  • 平移T1
  • 旋转R1
  • 平移T2

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

然后一次应用所有这些变换到点上:Y = FX

请注意,矩阵乘法不是交换律,因此顺序很重要

OpenGL在内部使用这些矩阵(还有几种类型,如缩放矩阵)。您可以使用命令(来自此处的示例)获取当前变换矩阵:

glGetDoublev(GL_MODELVIEW_MATRIX, redTransformationMatrix);

以下是如何正确表示这些数据的方法(详细信息在此处):

enter image description here

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


3
您可以使用glGetDoublev从OpenGL状态中检索矩阵:
GLdouble projectionMatrix[16];
glGetDoublev(GL_PROJECTION, projectionMatrix);

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

请注意,当您先进行翻译然后旋转时,也会旋转翻译向量。 通常,您会在原点旋转对象,然后将其平移,从而在平移终点得到旋转后的对象。

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

p' = projectionMatrix * modelViewMatrix * p

我建议在这些操作中使用glm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接