这里我有一个点 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不是我预期的结果!
我知道先进行平移,然后进行旋转才能得到正确的结果,但是为什么我不能先进行旋转呢?