2

ベクトルを Z 軸に回転させたいのですが、その方向は Z 軸後方です。したがって、ベクトルが (1,1,1) の場合、結果は (0,0,-sqrt(3)) になります。

私の考えは2段階です。最初のステップは、X 軸を中心に私のベクトルを XZ 平面に回転させることです。2 番目のステップは、Y 軸を中心に XZ 平面でベクトルを Z 軸に回転させることです。

これが私のコードです:

GLfloat p[4] = {1,1,1,0}; //my vector, in homogeneous coordinates
GLfloat r[4]; //result vector to test

float theta1 = ((double)180/PI)*asin(p[1]/sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2])); 
//angle theta1 between the vector and XZ plane, is this right ??? I doubt it !!!
float theta2 = ((double)180/PI)*atan(p[0]/p[2]); 
//angle theta2 between the vector's projection in XZ plane and Z axis 

GLfloat m[16]; 
glMatrixMode(GL_MODELVIEW); // get the rotation matrix in model-view matrix
glPushMatrix();
glLoadIdentity();
glRotatef(theta1, 1,0,0); //rotate to the XZ plane
glRotatef(180-theta2,0,1,0); //rotate to the Z axis
glGetFloatv(GL_MODELVIEW_MATRIX, m); // m is column-major.
glPopMatrix();

// use the matrix multiply my vector and get the result vector r[4]
//my expectation is (0,0,-sqrt(3))
r[0] = p[0]*m[0]+p[1]*m[4]+p[2]*m[8]+p[3]*m[12];
r[1] = p[0]*m[1]+p[1]*m[5]+p[2]*m[9]+p[3]*m[13];
r[2] = p[0]*m[2]+p[1]*m[6]+p[2]*m[10]+p[3]*m[14];
r[3] = p[0]*m[3]+p[1]*m[7]+p[2]*m[11]+p[3]*m[15]; 

ただし、結果 r[4] は私の期待ではありません。そのため、上記のいくつかの場所でいくつかの間違いを犯したと思います。誰か私にそれについてのヒントを教えてもらえますか?

4

1 に答える 1

7

1 つのベクトルを回転して別のベクトルに向くには:

  1. それを正規化する
  2. 内積をとって回転角の余弦を得る
  3. 外積をとって直交回転ベクトルを見つける
  4. #2で見つかった角度でその新しいベクトルを中心に回転します

| A x B | = sin(theta)ifABが両方とも正規化されていることを覚えていれば、ステップ 2 を省略できます。

于 2012-05-29T15:11:45.840 に答える