首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >四元数-旋转到

四元数-旋转到
EN

Stack Overflow用户
提问于 2012-10-22 23:46:05
回答 4查看 4.5K关注 0票数 4

我在世界空间中有一些对象,假设在(0,0,0)处,并希望将其旋转到面(10,10,10)。

我如何使用四元数来实现这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-23 01:56:39

这个问题不太合理。你说你想要一个对象“面对”一个特定点,但这并没有提供足够的信息。

首先,面对这个方向意味着什么?在OpenGL中,这意味着局部参考系中的-z轴与某些外部参考系中的指定方向对齐。为了实现这种对齐,我们需要知道对象的相关轴当前“面向”的方向。

然而,这仍然不能定义一个独特的转换。即使知道要使-z轴指向哪个方向,对象仍可以围绕该轴自由旋转。这就是为什么函数gluLookAt()要求你提供一个'at‘方向和一个'up’方向。

我们需要知道的下一件事是最终结果需要采用什么格式?对象的方向通常以四元数格式存储。但是,如果要以图形方式旋转对象,则可能需要旋转矩阵。

因此,让我们做一些假设。我将假设您的对象以世界的点c为中心,并具有默认对齐方式。即,对象的xyz轴与世界上的xy<>e216>和<>e117z轴对齐。这意味着对象相对于世界的方向可以表示为单位矩阵或单位四元数:[1 0 0 0] (使用四元数约定,其中w优先)。

如果需要将对象的-z轴与p:=p.x p.y p.z点对齐的最短旋转,则可以围绕轴a按φ旋转。现在我们将找到这些值。首先,我们通过对向量p-c进行归一化,然后取单位长度的-z向量的叉积,然后再次进行归一化,找到axis a:

规格化a= normalize( crossProduct(-z,normalize(p-c) ) );

这两个单位向量之间的最短角度,通过取其点积的反余弦来找到:

φ= acos( Acos ));

不幸的是,这是两个向量形成的角度的绝对值的度量。当旋转a时,我们需要弄清楚它是正数还是负数。肯定有一种更优雅的方法,但首先想到的方法是找到第三个轴,垂直于a和-z,然后从它的点积中提取符号与我们的目标轴。Vis:

b = crossProduct(a,-z );

如果( dotProduct(b,normalize(p-c) )<0 )-φ=φ;

一旦我们有了轴和角度,就很容易把它变成一个四元数:

q = cos(φ/2) sin(φ/2)a;

这个新的四元数表示对象的新方向。它可以转换为用于渲染的矩阵,或者可以使用它直接旋转对象的顶点,如果需要,可以使用四元数乘法规则。

票数 8
EN

Stack Overflow用户

发布于 2012-10-22 23:58:15

Ogre::Vector3 class的OGRE源代码中可以找到一个计算表示两个向量之间旋转的四元数的示例。

票数 1
EN

Stack Overflow用户

发布于 2012-10-23 00:40:19

为了回应你的澄清,为了回答这个问题,我厚颜无耻地复制了一个非常有趣和整洁的算法来寻找两个向量之间的四元组,这看起来像我以前从未在here中见过的。从数学上讲,它似乎是有效的,而且由于您的问题是关于它背后的数学知识,我相信您能够将此伪代码转换为C++。

代码语言:javascript
复制
quaternion q;
vector3 c = cross(v1,v2);
q.v = c;
if ( vectors are known to be unit length ) {
    q.w = 1 + dot(v1,v2);
} else {
    q.w = sqrt(v1.length_squared() * v2.length_squared()) + dot(v1,v2);
}
q.normalize();
return q;

如果您需要帮助澄清伪代码的任何部分,请告诉我。不过,这应该很简单。

代码语言:javascript
复制
dot(a,b) = a1*b1 + a2*b2 + ... + an*bn

代码语言:javascript
复制
cross(a,b) = well, the cross product. it's annoying to type out and
can be found anywhere.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13014973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档