欧拉角 四元数 旋转 29
程序员文章站
2022-03-26 17:25:29
...
1)笔记
1)旋转的表示
(1)直观的旋转,任何3D物体,你可以把一个物体旋转某个角度,分别绕XYZ旋转多少,然后得到一个朝向
也就是:任何一个3D物体总是可以表示为:绕XYZ轴旋转了多少度
X:30 Y:60 Z:70-->物体的一个方位-->旋转-->欧拉旋转
(2)旋转先后顺序很重要 X:30 Y:60 Z:70 X:30 Y:70 Z:60 顺序不一样,导致的结果可能不一样(拿着一个长方体 绕X轴和Z轴旋转一下就知道了);
游戏引擎规定一个默认的顺序
unity的欧拉旋转顺序: zxy
creator 3d: yzx
顺序不一样结果不一样,所以游戏引擎规定了一个顺序;
(3)欧拉旋转-->3维向量 是垂直于哪个轴旋转 绕x轴旋转多少度 绕y轴旋转多少度 绕z轴旋转多少度
(4)欧拉旋转
优点: 简单、直观
缺点:
不方便参与矩阵计算, 模型坐标变换到世界某个位置,需要乘上变换矩阵 平移*旋转*缩放;
有万向节锁的缺点;
(5)引擎内部运算的时候,我们不使用欧拉角,而是使用四元数-->表示物体旋转的数学工具
(6)四元数也可以表示旋转,但是没有欧拉角那么直观:
(7)方便参与矩阵计算;
没有万向节锁的毛病;
(8)四元素(Quat)和欧拉角的变换 yzx
x y z w, 是个四维向量
Quat(x,y,z,w),静态方法和成员,Vec3类似
静态方法:
欧拉角转四元数: fromEuler: 给定一个欧拉角,可以返回一个表示旋转的四元数对象
四元数转欧拉角: toEuler
[-180,180] [-90.90]
[-180,-90] [90, 180]
成员方法:
getEulerAngles
2)3D物体旋转控制
四元数来控制旋转:
rotation:获取本地旋转,返回对象是一个四元数
worldRotation:世界旋转返回对象也是一个四元数
getRotation(是否new四元数对象):
getWorldRotation: 获取世界旋转,返回一个四元数对象
setRotation(设置节点世界旋转, 有2个版本 四元数对象版本Quat 四元数分量版本(x,y,z,w))
setWorldRotation:设置节点世界旋转(叠加父亲的旋转角度)
欧拉角来控制旋转:
eulerAngles: 表示本地旋转
setRotationFromEuler:使用欧拉角来设置物体的本地旋转(x,y,z) 绕x轴 、绕y轴 、绕z轴 旋转多少度
setWorldRotationFromEuler: 不管父亲旋转多少度, 设置为世界旋转多少度(x,y,z) -->YZX
3)
getXXX: 是new出来
xxx: 不new
下一篇: 程序模拟数字时钟
推荐阅读