在OpenGL中从一个帧中的另一个帧中查找一个点的坐标

Finding coordinates of a point from a frame in another frame in OpenGL

我有正常的默认 x,y 坐标系。让我们称之为 Frame1。 然后我使用以下行创建一个新框架:

glTranslatef(40, 125, 0);
glRotatef(theta, 0.0, 0.0, 1.0); //theta is in degrees here
glTranslatef(-40, -125, 0);

我们称之为 Frame2.

我在 Frame2 中有一个点 (x,y)。 现在,我如何知道同一点相对于 Frame1 的坐标? 意思是,该点保持静止,但它相对于 Frame1 的坐标是多少? 我试过:

alpha = atan2(Y,X);
hypo = Y/sin(alpha);
alphatheta = alpha + theta; //theta is in radians here and so is alpha
newY = hypo * sin(alphatheta);
newX = hypo * cos(alphatheta);

但这行不通。我猜翻译有一些差异,因为旋转是围绕 (40, 125) 而不是原点进行的。

那么,我如何找出 newX 和 newY 呢? 即如果我在 Frame1 中绘制 (newX,newY),我应该从 Frame2 中得到与 (X,Y) 相同的点。

或者,我什至可以这样问, 如果某物围绕某个点 (a,b) 旋转一个角度 theta,则同一物体将围绕原点旋转多少?

一个简单的方法是为每个变换生成矩阵并将它们与 Frame2 中的点相乘。 假设您在 Frame2 中有 (x, y, z, w)(X, Y, Z, W) 是它在 Frame1 中的等效项,并且您执行以下转换以达到 Frame2:

Frame1 -> Transform1 -> Transform2 -> Transform3 -> Frame2
(X, Y, Z, W) = Matrix(T1) x Matrix(T2) x Matrix(T3) x (x, y, z, w)

在您的示例中,它将是:

(newX, newY) = T(40, 125, 0) x R(theta, 0, 0, 1) x T(-40, -125, 0) x (x, y)

现在,TR 表示为行主矩阵:

T(a, b, c) = { {0,0,0,a}, {0,0,0,b}, {0,0,0,c}, {0,0,0,1} }
R(a, 0, 0, 1) = { {cos(a),-sin(a),0,0}, {sin(a),cos(a),0,0}, {0,0,1,0}, {0,0,0,1} }