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

时间:2016-01-21 23:40:52

标签: opengl matrix rotation trigonometry

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

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

让我们称之为第2帧

我在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)周围旋转一个角度θ,那么在原点周围旋转相同的东西会是多少?

1 个答案:

答案 0 :(得分:0)

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

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} }