我正在研究使用OpenGL进行3D渲染,而用于描述旋转的Quaternions让我有点陷入困境。
从我到目前为止所读到的,它们的代表不超过4个数字。然而,这四个数字是什么让我完全难过。我看到四元数用标量(通常为1)表示,然后用i, k, j
表示,有时用a, b, c, d
表示,有时用两者混合,有时用w, x, y, z
表示。
它们是代表四元数的不同方面,还是它们只是相同值的不同字母?如果我要推出Quaternion类,我将使用哪些4个数据成员?四元数是否使用4个以上的变量,但某些变量会被忽略,因为3D图形使用数学中出现的实际四元数的简化版本?
我认为如果我看到四元数的实现,甚至伪代码,我可以更好地理解。不幸的是,当数学符号出现时,我的大脑就会关闭......如果有人提出一个开源库,它有明确写出的四元数,我可以从中学到,无论语言如何,都会给你带来巨大的帮助!
答案 0 :(得分:3)
在下文中,我们仅讨论 unit 四元数。
“从我到目前为止所读到的内容来看,它们的数量不超过4个。” 四元数正好由4个值表示:(x,y,z,w)
“然而,这四个数字是什么,让我完全难过。” 在四元数中,你有一个标量值(通常是w)和一个虚数向量(通常是x,y,z)。您只有一个单位四元数,标量值为1:它是标识四元数(0,0,0,1)。
“四元数使用的变量超过4个。” 不,四元数是4维的。
“但某些变量会被忽略,因为3D图形使用数学中出现的实际四元数的简化版本?” 请记住,您的四元数是单位。因此,如果您有前3个组件,则可以推断出最后一个组件。
如果您想了解使用单位四元数进行3D旋转,我建议您阅读:
最重要的部分是:
然后,您可以阅读以下内容以了解为什么单位四元数并不总是3D旋转的最佳表示:
答案 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)
作为角度,将其转换为轴角度表示。然而,直接转换为旋转矩阵更有效。