我有正常的默认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)周围旋转一个角度θ,那么在原点周围旋转相同的东西会是多少?
答案 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)
现在,T
和R
表示为行主矩阵:
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} }