8.3.3 Euler方法:欧拉角对应的四元数
基本语法:(1)public static Quaternion Euler(Vector3 euler);
(2)public static Quaternion Euler(float x, float y, float z);
功能说明:此方法用于返回欧拉角Vector3(x,y,z)对应的四元数Quaternion实例。四元数Quaternion(qx,qy,qz,qw)与其欧拉角eulerAngles(ex,ey,ez)之间的对应关系如下。
已知PIover180=3.141592/180=0.0174532925f是计算机图形学中一常量,则变换过程如下。
ex=ex* PIover180/2.0f;
ey=ey* PIover180/2.0f;
ez=ez* PIover180/2.0f;
则:
qx=sin(ex)cos(ey)cos(ez)+cos(ex)sin(ey)sin(ez);
qy=cos(ex)sin(ey)cos(ez)- sin (ex)cos(ey)sin(ez);
qz=cos(ex)cos(ey)sin(ez)-sin (ex)sin(ey)cos(ez);
qw=cos(ex)cos(ey)cos(ez)+sin (ex)sin(ey)sin(ez);
实例演示:下面通过实例验证上述算法。
using UnityEngine;
using System.Collections;
public class Euler_ts : MonoBehaviour
{
//记录欧拉角,单位为角度,可以在Inspector面板中设置
public float ex, ey, ez;
//用于记录计算结果
float qx, qy, qz, qw;
float PIover180 = 0.0174532925f;//常量
Quaternion Q = Quaternion.identity;
void OnGUI()
{
if (GUI.Button(new Rect(10.0f, 10.0f, 100.0f, 45.0f), "计算"))
{
Debug.Log("欧拉角:" + " ex:" + ex + " ey:" + ey + " ez:" + ez);
//调用方法计算
Q = Quaternion.Euler(ex, ey, ez);
Debug.Log("Q.x:" + Q.x + " Q.y:" + Q.y + " Q.z:" + Q.z + " Q.w:" + Q.w);
//测试算法
ex = ex * PIover180 / 2.0f;
ey = ey * PIover180 / 2.0f;
ez = ez * PIover180 / 2.0f;
qx = Mathf.Sin(ex) * Mathf.Cos(ey) * Mathf.Cos(ez) + Mathf.Cos(ex) * Mathf.Sin(ey) * Mathf.Sin(ez);
qy = Mathf.Cos(ex) * Mathf.Sin(ey) * Mathf.Cos(ez) - Mathf.Sin(ex) * Mathf.Cos(ey) * Mathf.Sin(ez);
qz = Mathf.Cos(ex) * Mathf.Cos(ey) * Mathf.Sin(ez) - Mathf.Sin(ex) * Mathf.Sin(ey) * Mathf.Cos(ez);
qw = Mathf.Cos(ex) * Mathf.Cos(ey) * Mathf.Cos(ez) + Mathf.Sin(ex) * Mathf.Sin(ey) * Mathf.Sin(ez);
Debug.Log(" qx:" + qx + " qy:" + qy + " qz:" + qz + " qw:" + qw);
}
}
}
在这段代码中,首先声明了三个公共变量ex,ey, ez,用于记录欧拉角,单位为角度,其值可以在Inspector面板中设置。然后在OnGUI方法中定义了一个Button,先调用Quaternion的静态方法Euler,打印出计算结果,然后再测试功能说明中的算法,并打印出计算结果。图8-6是一组数据的测试结果。