0

这里我有一个点 P(x,y,z,1)。然后我围绕一个已知的角度和一个向量将 P 旋转到点 P1(x1,y1,z1,1)。并且根据 P1 的坐标,我可以将 P1 平移到点 P2 (0,0,z1,1)。现在我只想得到一个可以直接将 P 转换为 P2 的矩阵所以,我的代码如下:

GLfloat P[4] ={5,-0.6,3.8,1};
GLfloat m[16];  //This is the rotation matrix to calculate P1 from P
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRotatef(theta, v1,v2,v3);//theta and (v1,v2,v3) is constant
glGetFloatv(GL_MODELVIEW_MATRIX, m);
glPopMatrix();

//calculate P1 from P and matrix m
GLfloat P1;
P1[0] = P[0]*m[0]+P[1]*m[4]+P[2]*m[8]+m[12];
P1[1] = P[0]*m[1]+P[1]*m[5]+P[2]*m[9]+m[13];
P1[2] = P[0]*m[2]+P[1]*m[6]+P[2]*m[10]+m[14];
P1[3] = P[0]*m[3]+P[1]*m[7]+P[2]*m[11]+m[15];
//after calculation P1 = {0.15,-3.51,-5.24,1}

GLfloat m1[16]; //P multiply m1 can get P2 directly
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glRotatef(theta, v1,v2,v3);//theta and (v1,v2,v3) is constant as above
glTranslatef(-P1[0], -P1[1], 0);// after rotation we get P1, then translation to P2  
glGetFloatv(GL_MODELVIEW_MATRIX, m1);
glPopMatrix();

//calculate P2 from P and matrix m1
GLfloat P2[4];
P2[0] = P[0]*m1[0]+P[1]*m1[4]+P[2]*m1[8]+m1[12];
P2[1] = P[0]*m1[1]+P[1]*m1[5]+P[2]*m1[9]+m1[13];
P2[2] = P[0]*m1[2]+P[1]*m1[6]+P[2]*m1[10]+m1[14];
P2[3] = P[0]*m1[3]+P[1]*m1[7]+P[2]*m1[11]+m1[15];
//after this calculation, I expect P2 should be (0,0,-5.24) that is (0,0,p1[2])
//however, the real result is not my expectation! Where I do wrong???

其实我分析过这个问题。我发现矩阵乘法的顺序很奇怪。在我做 glRotatef(theta, v1,v2,v3) 之后,我得到了矩阵 m。没关系。米是

米[0]米[1]米[2]0

米[4]米[5]米[6]0

米[8]米[9]米[10]0

0 0 0 1

如果我单独执行 glTranslatef(-P1[0], -P1[1], 0),我会得到平移矩阵 m'。m' 是

1 0 0 0

0 1 0 0

0 0 0 1

-P1[0] -P1[1] 0 1

所以我认为在做glRotatef(theta, v1,v2,v3) 和glTranslatef(-P1[0], -P1[1], 0) 之后,m1 = m*m',即

米[0]米[1]米[2]0

米[4]米[5]米[6]0

米[8]米[9]米[10]0

-P1[0] -P2[0] 0 1

但是,在实际程序中,m1 = m'*m,所以P2不是我预期的结果!

我知道先进行平移,然后进行旋转才能得到正确的结果,但是为什么我不能先进行旋转呢?

4

1 回答 1

2

旋转和平移是不可交换的。(矩阵乘法一般是不可交换的,但在某些特殊情况下,例如所有平移、所有2D旋转、所有缩放、一次旋转混合均匀缩放,动作/矩阵是可交换的)。

如果先旋转,则平移将沿旋转坐标的方向进行。

例如,平移 (1, 0),然后旋转 90 度,将在 (1, 0) 处给出原点(假设从单位矩阵开始)。与首先旋转 90 度相反,将在 (0, 1) 处给出原点。

在数学方面,由于这是坐标变换,任何新的变换都将与当前坐标变换矩阵相乘。例如,如果T是一个新的变换动作的矩阵,C是当前的变换矩阵,那么变换后,当前的变换矩阵就变成了TC。

于 2012-05-30T10:50:34.907 回答