1

(这都是正交模式,原点在左上角,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 (矩形旋转角度)?

谢谢!

编辑:我这样做的原因是为了碰撞检测。我需要知道矩形的坐标(即将成为刚体)在世界坐标位置中的位置以进行碰撞检测。

4

2 回答 2

2

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

替代文字

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

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

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

您还可以查看Wiki Rotation

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

对于 M => 模型视图矩阵, [xyzw] 的转置是您执行的对象坐标:

M[xyzw]T = [xyzw]T 的眼坐标

于 2009-10-07T19:01:54.920 回答
1

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

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

于 2009-10-08T11:06:55.383 回答