【问题标题】:rotating one object according to point根据点旋转一个物体
【发布时间】:2012-11-30 13:51:29
【问题描述】:
                  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 ()

【问题讨论】:

  • 围绕一个点的旋转没有很好的定义。对象 1、对象 2 和 Y 点是否定义了平面/法线?
  • @AkiSuihkonen 看不懂,请说清楚

标签: c math opengl graphics


【解决方案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];

【讨论】:

  • 你能多解释一下轴吗?我在 3d 环境中旋转。
  • 您不能只围绕一个点旋转。要定义任务,您应该定义轴。例如,您的点位于 (1,0,0) 并希望将其围绕原点 (0,0,0) 旋转 90 度。您可以围绕 Z 轴 (0,0,1) 执行此操作并获取坐标 (0,1,0) 的点。或者你可以围绕 Y 轴旋转它并得到 (0,0,-1)。或者您甚至可以绕 X 轴旋转并获得相同的点 (1,0,0)。
  • 我该怎么办?我应该先计算轴然后根据它们旋转对象
  • 没错。但不要忘记将坐标原点转换为(和从)旋转中心
  • 你说先计算轴,然后先将 acc 翻译成 -x,-y,-z 然后旋转 Q,axis[0],axis[1],axis[2] 然后翻译回来跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多