Unity3D中Quaternion.Euler方法解析
2015-11-05 15:56
686 查看
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);
实例演示:下面通过实例验证上述算法。
在这段代码中,首先声明了三个公共变量ex,ey, ez,用于记录欧拉角,单位为角度,其值可以在Inspector面板中设置。然后在OnGUI方法中定义了一个Button,先调用Quaternion的静态方法Euler,打印出计算结果,然后再测试功能说明中的算法,并打印出计算结果。图8-6是一组数据的测试结果。
基本语法:(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是一组数据的测试结果。
相关文章推荐
- 浅析游戏引擎的资源管理机制 扒一扒Unity3D中隐藏在背后的资源管理
- 【VR】Leap Motion 官网文档(二) Unity插件概述
- Unity3D工程版本管理方案
- UNITY 5.2 Time类
- Unity结合讯飞语音在线识别
- unity3d 保存(截图、拍照)图片 到Android IPhone手机相册
- Unity3D调用第三方SDK(之一)从eclipse到Unity3D
- unity 粒子缩放代码实现
- Spine 2D骨骼动画插件 for Unity
- Unity3D研究院之LZMA压缩文件与解压文件
- Unity快捷键
- [笨木头Unity3D]杂记003·Unity在Android中读取文件
- Unity的实时绘制与坐标转换总结
- Unity3D中几种常见切换方式
- Unity3D运行流图
- Unity3D核心类型(二)
- Unity3D核心类型
- 总结使用Unity 3D优化游戏运行性能的经验
- Unity3D中Mathf.LerpAngle使用
- ToonOneLightVF