【问题标题】:rotation of objects in OpenGL using 3D vector and angle使用 3D 矢量和角度在 OpenGL 中旋转对象
【发布时间】:2012-12-28 16:09:18
【问题描述】:

我在 OpenGL 程序中遇到对象的方向问题,我无法根据 3D 矢量和角度或 4D 矢量计算 x、y、z 的旋转。 我正在使用 c++。

我有:

Vector3f myVector;
float angle;    
float rotx;
float roty;    
float rotz;

//i need smomething like

doSomething(a,angle,&rotx,&roty,&rotz);    
glRotatef(rotx,1.0,0,0);    
glRotatef(roty,0,1.0,0);    
glRotatef(rotz,0,0,1.0);

// draw object

“myVector”是 3d 空间中的向量。我想在矢量方向旋转对象。 “角度”是对象围绕向量的旋转。 “rotx,roty,rotz”是局部变量。如何计算 rotx,roty,royz 来做到这一点?

http://en.wikipedia.org/wiki/File:Euler_AxisAngle.png

在链接上的图片中,我的对象朝向“x”方向,我想将其朝向“e”方向,“O”是我的“角度”。

【问题讨论】:

  • 我想你忘记了这个问题 ;-) .. 你能提供更多关于你想要达到的目标的细节吗?
  • 听起来就像你想要一个旋转的quaternion representation - 但你并没有真正指定你的矢量/角度是如何确定的,或者如何使用它们.
  • 您可以将轴和角度直接传递给glRotatef:glrotatef(angle,a.x,a.y,a.z)。你真的需要把它分成三个旋转吗?

标签: opengl


【解决方案1】:

如何计算 rotx,roty,royz 来做到这一点?

您的问题没有唯一的解决方案。对于每个目标方向,有 6 种不同的欧拉角表示方式。

唯一能明确表示旋转的方法是旋转矩阵,或者它们的近亲四元数。

glRotate 的参数非常接近四元数。实际上,轴参数是四元数的归一化 i,j,k 元素,而实际四元数部分是以弧度为单位的旋转角度。

【讨论】:

  • 这个我理解并实现了。有没有办法让它回到向量域中,我可以将它乘以速度和获得新位置的时间?如果这是一个愚蠢的问题,我很抱歉。
  • @slobacartoonac:实际上四元数在积分旋转方面比欧拉角要好得多。事实上,它们在计算机图形学中的主要用途之一是旋转之间的插值。如果你真的想坚持欧拉角(**颤抖**),那么我建议使用最小二乘优化来找到一组角度,当应用于旋转矩阵的组合时,最小化表示的矩阵的差异由四元数组成。
  • 那么请告诉我我是否正确。我可以有对象,3个otogonal vetors(1,0,0),(0,1,0),(0,0,1),在我的情况下首先代表前锋。我用四元数变换它们(旋转它们),然后用它们来定位?
  • @slobacartoonac:你有这三个轴,它们实际上是一个单位变换矩阵。当您对它们中的每一个应用一个四元数时,就好像您使用正确的轴和角度对 glRotatef 进行 一次 调用,然后转换整个矩阵。请参阅cs.princeton.edu/~gewang/projects/darth/stuff/quat_power.html,尤其是“四元数到轴角”部分;然后,您只需将获得的轴和角度用于 一个 glRotate 调用。 不要再认为方向是 3 次复合旋转的结果,你只需要一个!
猜你喜欢
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2019-10-13
  • 1970-01-01
相关资源
最近更新 更多