2012-02-17 32 views
3

我在一个点上有一个对象,比如x,y,z相对于原点。
我想对这个点应用一些转换,比如说旋转和平移,并在转换的点上渲染对象。我正在使用glTranslatef()glRotatef()函数。它看起来有些东西是这样的:OpenGL转换

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> 

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

+0

你想要做什么 - 在给定的坐标下绘制对象,或绘制它像你一样例如,但不知怎的,知道它在哪里结束? – 2012-02-17 13:26:42

+0

我需要在转换后的位置绘制一个对象,并知道转换后的坐标,以便进行计算。 – itsraining 2012-02-17 13:29:58

+0

@flopcoder为什么您取消了我的大部分编辑,将更正的问题带回到问题中?例如,它是OpenGL,不是OpenGl – Bart 2012-02-17 13:49:26

回答

3

可以使用glGetDoublev检索OpenGL的状态矩阵:

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

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

还要注意,当你第一次翻译,然后旋转,你是旋转平移向量,太。 通常,旋转原点中的对象然后翻译它,从而在翻译终点处产生旋转的对象。

编辑:为了让转换后的坐标P”,你需要使用这些矩阵变换点p

p' = projectionMatrix * modelViewMatrix * p 

我建议使用glm对于这些类型的操作。

+0

谢谢。我会试试看 – itsraining 2012-02-17 13:36:35

12

我会先给你一些理论。 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

而且将所有这些转换应用到该点t一次:Y = FX

请注意矩阵乘法不是commutative所以订单确实重要

OpenGL可以在内部使用这些矩阵(只有几种类型,如scale matrix)。你可以得到当前变换矩阵与命令(例如,从here):

glGetDoublev(GL_MODELVIEW_MATRIX, redTransformationMatrix); 

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

enter image description here

除了最后所有图片一个取自wikipedia.org