O
position 2
O Y
object ( x,y,z )
position 1
我希望根据固定点(x,y,z)以Q角度旋转对象。使用opengl,我该怎么办?
物体从位置1移动到位置2。
我知道Q,(x,y,z)。
我做了:
glPushMAtrix ()
glTranslatef ( -x, -y, -z ) ;
glRotatef ( Q, 1.0f, 0.0f, 0.0f );
glCylinder ( /*argument*/ )
glPopMatriX ()
答案 0 :(得分:1)
如果您在3D空间中旋转并且只知道对象,角度和旋转中心,那么您的任务是未定义的。在3D空间中,您只能围绕某个轴旋转,而不能旋转。
从您的代码示例中,您围绕X轴旋转。让我猜这就是你真正想要的。
要实现这一点,您应该将坐标系设置为旋转中心,执行旋转并将坐标系转换回来。
glTranslatef(-x, -y, -z);
glRotatef(Q, 1.0, 0.0, 0.0);
glTranslatef(x, y, z);
// draw the object
如果您知道对象的初始和最终位置,则可以计算旋转轴。 (因为3个点总是定义一个平面及其法线。)在矢量符号中它应该是这样的(在轴方向上可能是错误的。如果物体在相反方向上旋转,则改变轴或角度的符号)。
axis = vec(center_of_rotation - initial_position, center_of_rotation - final_position)
或多一点“为傻瓜”
float X1[3]; // initial position
float X2[3]; // final position
float O[3]; // orign of rotation
float OX1[3]; OX1[0] = X1[0] - O[0]; OX1[1] = X1[1] - O[1]; OX1[2] = X1[2] - O[2];
float OX2[3]; OX2[0] = X2[0] - O[0]; OX2[1] = X2[1] - O[1]; OX2[2] = X2[2] - O[2];
float axis[3]; // vector product OX1 and OX2
axis[0] = OX1[1]*OX2[2]-OX1[2]*OX2[1];
axis[1] = OX1[2]*OX2[0]-OX1[0]*OX2[2];
axis[2] = OX1[0]*OX2[1]-OX1[1]*OX2[0];