四元数表示还是例子?

时间:2014-07-08 09:49:54

标签: c++ opengl math 3d quaternions

我正在研究使用OpenGL进行3D渲染,而用于描述旋转的Quaternions让我有点陷入困境。

从我到目前为止所读到的,它们的代表不超过4个数字。然而,这四个数字是什么让我完全难过。我看到四元数用标量(通常为1)表示,然后用i, k, j表示,有时用a, b, c, d表示,有时用两者混合,有时用w, x, y, z表示。

它们是代表四元数的不同方面,还是它们只是相同值的不同字母?如果我要推出Quaternion类,我将使用哪些4个数据成员?四元数是否使用4个以上的变量,但某些变量会被忽略,因为3D图形使用数学中出现的实际四元数的简化版本?

我认为如果我看到四元数的实现,甚至伪代码,我可以更好地理解。不幸的是,当数学符号出现时,我的大脑就会关闭......如果有人提出一个开源库,它有明确写出的四元数,我可以从中学到,无论语言如何,都会给你带来巨大的帮助!

3 个答案:

答案 0 :(得分:3)

在下文中,我们仅讨论 unit 四元数。

“从我到目前为止所读到的内容来看,它们的数量不超过4个。” 四元数正好由4个值表示:(x,y,z,w)

“然而,这四个数字是什么,让我完全难过。” 在四元数中,你有一个标量值(通常是w)和一个虚数向量(通常是x,y,z)。您只有一个单位四元数,标量值为1:它是标识四元数(0,0,0,1)。

“四元数使用的变量超过4个。” 不,四元数是4维的。

“但某些变量会被忽略,因为3D图形使用数学中出现的实际四元数的简化版本?” 请记住,您的四元数是单位。因此,如果您有前3个组件,则可以推断出最后一个组件。

如果您想了解使用单位四元数进行3D旋转,我建议您阅读:

Quaternions, by Ken Shoemake

最重要的部分是: enter image description here

然后,您可以阅读以下内容以了解为什么单位四元数并不总是3D旋转的最佳表示:

Practical Parameterization of Rotations Using the Exponential Map., by F. Sebastian Grassia. Journal of Graphics Tools, 3(3):29-48, 1998

答案 1 :(得分:2)

OGRE(开放图形渲染引擎)有一个很好的页面(主要针对开发人员):

http://www.ogre3d.org/tikiwiki/Quaternion+and+Rotation+Primer

由于OGRE是开源的,您还可以在以下位置浏览源代码:

http://www.ogre3d.org/docs/api/1.9/class_ogre_1_1_quaternion.html

答案 2 :(得分:1)

四元数总是4个数字,你可以称之为任何东西,但顺序很重要。

i,j,k通常是带有quat = 0.5i+0.1j+0.2k+0.8的虚构表示i^2=j^2=k^2=i*j*k=-1,这是对正常虚数(a+bi数字)的扩展。

x,y,z,w表示只有4个数字,上面的例子意味着x=0.5, y=0.1, z=0.2, w=0.8

要从中获取旋转,您可以将标准化的x, z, y作为轴,将2*acos(w)作为角度,将其转换为轴角度表示。然而,直接转换为旋转矩阵更有效。