【问题标题】:How to rotate a vector to a place that is aligned with Z axis?如何将矢量旋转到与 Z 轴对齐的位置?
【发布时间】:2012-05-29 12:15:43
【问题描述】:

我想将一个向量旋转到 Z 轴,它的方向是 Z 轴向后。所以如果向量是(1,1,1),我的结果应该是(0,0,-sqrt(3))。

我的想法是两个步骤。第一步是将我的向量绕 X 轴旋转到 XZ 平面。第二步,将XZ平面中的向量绕Y轴旋转到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] 不是我的预期。所以我认为我在上面的某些地方犯了一些错误。谁能给我一个提示?

【问题讨论】:

  • 我肯定误解了这个问题。给定一个向量v,您正在搜索x=(0,0,-v.length())?从您的问题来看:“到 Z 轴”-> x=y=0,而“Z 轴向后”表示沿 Z 轴的长度。
  • Stefan Hanke:是的,我就是这个意思..

标签: opengl matrix rotation rotatetransform


【解决方案1】:

旋转一个向量使其面向另一个向量:

  1. 规范化它
  2. 用他们的点积得到旋转角度的余弦
  3. 取它们的叉积来找到正交旋转向量
  4. 围绕新向量旋转 #2 中找到的角度

如果你记得| A x B | = sin(theta) 如果AB 都是标准化的,则可以省略第2 步。

【讨论】:

  • 天哪,你着火了。你的答案正是我想要的!!!非常感谢!!!!
猜你喜欢
  • 2015-08-18
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多