四元数、矩阵、欧拉角----个人学习

基本概念
  • 四元素、矩阵、欧拉角都可以认为是一个转换或坐标系
  • 欧拉角分为静态定义、动态定义(百度百科)
  • Unity中,欧拉角就是没有父物体时,检视面板中的值(Unity检视面板中的角度值会有一些偏差,例如实际数值为20,但显示19.78)
  • 欧拉角的加减运算,会产生万向节死锁
  • 万向节死锁:欧拉角到旋转是一个多对一的映射(即不同的欧拉角可以表示同一个旋转方向)

四元素、旋转矩阵
  • 四元数、旋转矩阵,可用于坐标(position)、旋转(rotation)的变换
  • 物体的旋转通过世界坐标系分别绕y轴、x轴、z轴旋转β、α、γ得到,则α、β、γ就是这个物体的欧拉角(静态定义),y、x、z顺序
关于Quaternion.AngleAxis、Quaternion.Euler

[AppleScript] 纯文本查看 复制代码

//绕自身轴旋转
a.rotation = a.rotation * Quaternion.AngleAxis(angle, Vector3.right);
//绕自身轴旋转
a.rotation = a.rotation * Quaternion.Euler(angle, 0, 0);
//绕世界轴旋转
a.rotation = a.rotation * Quaternion.AngleAxis(angle, a.InverseTransformDirection(a.right));
//这两种写法等价
a.rotation = a.rotation * Quaternion.AngleAxis(30, Vector3.forward) * Quaternion.AngleAxis(10, Vector3.right) * Quaternion.AngleAxis(20, Vector3.up);
a.rotation = a.rotation * Quaternion.Euler(0, 0, 30) * Quaternion.Euler(10, 0, 0) * Quaternion.Euler(0, 20, 0);

切记
  • 直接修改欧拉角没有意义,变换要通过四元素或旋在检视窗口中改变欧拉角某一数值,不代表物体绕某一轴旋转
Local --> World 坐标变换

一个物体B在物体A的正前方20米处,已知A的transfom,求B的坐标?

[AppleScript] 纯文本查看 复制代码

//方法一:
Vector3 result1 = A.position + A.forward * 20f;    //transform.forward 是代表方向的一个数值, 也就是将本地坐标系原点归位到(0,0,0)时的世界坐标
//方法二:
Matrix4x4 matrix = new Matrix4x4();
matrix.SetTRS(Vector3.zero, A.rotation, Vector3.one);
Vector3 result2 = A.position + matrix.MultiplyPoint(new Vector3(0, 0, 20f));
//方法三:
Matrix4x4 matrix3 = new Matrix4x4();
matrix3.SetTRS(A.position, A.rotation, Vector3.one);
Vector3 result3 = matrix3.MultiplyPoint(new Vector3(0, 0, 20f));
//方法四:
Matrix4x4 matrix4 = new Matrix4x4();
matrix4.SetTRS(Vector3.zero, A.rotation, Vector3.one);
Vector3 result4 = A.position + matrix4.MultiplyVector(new Vector3(0, 0, 20f));
//方法五:
Matrix4x4 matrix45 = new Matrix4x4();
matrix45 = A.transform.localToWorldMatrix;
Vector3 result5 = A.position + matrix4.MultiplyVector(new Vector3(0, 0, 20f));
//方法六:
Vector3 angle = A.eulerAngles;
Vector3 result6 = A.position +
    Quaternion.AngleAxis(angle.y, A.up) *
    Quaternion.AngleAxis(angle.x, A.right) *
    Quaternion.AngleAxis(angle.z, A.forward) *
                    new Vector3(0, 0, 20f);
Debug.Log("result1 = " + result1);
Debug.Log("result2 = " + result2);
Debug.Log("result3 = " + result3);
Debug.Log("result4 = " + result4);
Debug.Log("result5 = " + result5);
Debug.Log("result6 = " + result6);

猜你喜欢

转载自blog.csdn.net/Edision_li/article/details/82752362