c ++ opengl将模型坐标转换为世界坐标以进行碰撞检测

时间:2009-10-07 18:33:19

标签: c++ opengl matrix rotation trigonometry

(这都是在正交模式下,原点在左上角,x在右边是正,y在y轴下是正的)

我在世界空间中有一个矩形,它可以有一个旋转m_rotation(以度为单位)。

我可以使用矩形精细,它旋转,缩放,你可以想要它做的一切。

我真正感到困惑的部分是从当地坐标计算矩形世界坐标。

我一直在尝试使用公式:

x' = x*cos(t) - y*sin(t) 
y' = x*sin(t) + y*cos(t)

where (x, y) are the original points,
(x', y') are the rotated coordinates,
and t is the angle measured in radians

from the x-axis. The rotation is
counter-clockwise as written. 
-credits duffymo

我尝试实现这样的公式:

//GLfloat Ax = getLocalVertices()[BOTTOM_LEFT].x * cosf(DEG_TO_RAD( m_orientation )) - getLocalVertices()[BOTTOM_LEFT].y * sinf(DEG_TO_RAD( m_orientation ));
//GLfloat Ay = getLocalVertices()[BOTTOM_LEFT].x * sinf(DEG_TO_RAD( m_orientation )) + getLocalVertices()[BOTTOM_LEFT].y * cosf(DEG_TO_RAD( m_orientation ));

//Vector3D BL = Vector3D(Ax,Ay,0);

我为转换点创建一个向量,将其存储在矩形world_vertice成员变量中。没关系。但是,在我的主绘制循环中,我从(0,0,0)到矢量BL绘制一条线,看起来好像是从矩形上的点开始的一条线(矩形左下角的矩形)围绕世界坐标的起源。

基本上,随着m_orientation变大,它会围绕(0,0,0)世界坐标系原点绘制一个巨大的圆圈。编辑:当m_orientation = 360时,它会被设置回0。

我觉得我做错了这个部分:

  

和t是以弧度为单位测量的角度   从x轴。

可能我不应该在这个公式中使用m_orientation(矩形旋转角度)?

谢谢!

编辑:我这样做的原因是用于碰撞检测。我需要知道矩形的坐标(很快就是刚体)位于世界坐标位置以进行碰撞检测。

2 个答案:

答案 0 :(得分:2)

你所做的是在2d上角度Q的矢量的旋转[特殊线性变换]。它保持矢量长度并改变它在原点周围的方向。

alt text

[线性变换:加法L(m + n)= L(m)+ L(n)其中{m,n}€向量,齐次L( k .m)= k .L(m)其中m€vector和k€scalar]所以:

您将矢量分成两部分。像m [1,0] + n [0,1] =你的向量。 然后,正如您在图像中看到的那样,在这两个部分之后进行旋转,之后您的矢量就可以了 形式:

m [cosQ,sinQ] + n [-sinQ,cosQ] = [m cosQ - n sinQ,m sinQ + n cosQ]

您还可以查看Wiki Rotation

如果您尝试获取与对象坐标对应的眼睛坐标,则应将对象坐标乘以opengl中的模型视图矩阵。

对于M =>模型视图矩阵和[x y z w]的转置是你的对象坐标:

M [x y z w] T = [x y z w] T

的眼睛坐标

答案 1 :(得分:1)

这似乎有些过于复杂:通常你会将对象的世界位置和方向与其自己的本地坐标分开存储。旋转对象在模型空间中完成,因此位置不变。无论您是否进行旋转,每个坐标的世界位置都是相同的 - 将世界位置添加到本地位置以将本地坐标转换为世界空间。

任何旋转都发生在特定原点周围,典型的sin / cos公式假设(0,0)是您的原点。如果正在使用的坐标系当前没有(0,0)作为原点,则必须将其转换为执行旋转,然后转换回来的坐标系。通常定义模型空间使得(0,0)是模型的原点,使这一步变得微不足道。