繁体   English   中英

根据点旋转一个对象

[英]rotating one object according to point

                  O
                 position 2



 O                             Y
 object                      ( x,y,z )
 position 1

我想根据Q角度的固定点(x,y,z)旋转对象。 使用opengl,我该怎么做?

对象从位置1移到位置2。

我知道Q(x,y,z)。

我已经做好了 :

glPushMAtrix ()
glTranslatef ( -x, -y, -z ) ;
glRotatef ( Q, 1.0f, 0.0f, 0.0f );

glCylinder ( /*argument*/ ) 
glPopMatriX ()

如果您在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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM