• Unity3D Quaternion各属性和函数測试


    Quaternion属性与方法

    一,属性:

    x、y、z就不说了,仅仅看一个eulerAngles。代码例如以下:
    [csharp] view plaincopy
    1. public Quaternion rotation = Quaternion.identity;  
    2.   
    3. void Start()  
    4. {  
    5. rotation.eulerAngles = new Vector3(0, 30, 0);  
    6. transform.rotation = rotation;  
    7. print(rotation.eulerAngles.y);  
    8. }  
    效果:将物体绕y轴顺时针转30°,效果与transform.eulerAngles同样。

    物体rotation = (0,30,0)。可是不能直接为transform.rotation.eulerAngle赋值。


    二。方法

    1,function ToAngleAxis (out angle :float, out axis :Vector3) :void

    [csharp] view plaincopy
    1. public float angle = 0.0F;  
    2. public Vector3 axis = Vector3.zero;  
    3.   
    4. void Start()  
    5. {  
    6. transform.eulerAngles = new Vector3(0, 90, 0);  
    7. transform.rotation.ToAngleAxis(out angle, out axis);  
    8. print(angle + " " + axis);  
    9. }  
    效果:将物体的旋转角度返回到angles和axis里(物体的z轴和世界坐标z轴的夹角)。


    输入:transform.localEulerAngles=(0,0,0);
    输出:angle=0, axis=(1,0,0);
    输入:transform.localEulerAngles=(0,90,0);
    输出:angle=90,axis=(0,1,0);
    输入:transform.localEulerAngles=(270,0,0);
    输出:angle=90,axis=(-1,0,0)

    2。function SetFromToRotation (fromDirection :Vector3, toDirection :Vector3) :void

    [csharp] view plaincopy
    1. private Vector3 _from = Vector3.one;  
    2. private Vector3 _to = new Vector3(100f, 200f, 100f);  
    3. private Quaternion q;  
    4. private Vector3 headUpDir;  
    5.   
    6. void Start()  
    7. {  
    8. q.SetFromToRotation(_from, _to);  
    9. transform.rotation=q;  
    10. headUpDir=transform.TransformDirection(Vector3.forward);  
    11. }  
    效果:把物体的fromDirection旋转到toDirection
    输入:a=Vector3(0,0,1); b=Vector3(0,1,0)//把z轴朝向y轴
    输出: q=(-0.7,0,0,0.7); headUpDir=(0,1,0)
    输入:a=Vector3(0,0,1); b=Vector3(1,0,0)//把z轴朝向x轴
    输出: q=(0,0.7,0,0.7); headUpDir=(1,0,0)
    输入:a=Vector3(0,1,0); b=Vector3(1,0,0)//把y轴朝向x轴
    输出: q=(0,0,-0.7,0.7); headUpDir=(0,0,1)

    3,function SetLookRotation (view : Vector3, up : Vector3 = Vector3.up) : void
    [csharp] view plaincopy
    1. public Transform obj1;  
    2. public Transform obj2;  
    3. Quaternion q;  
    4.   
    5. void Update()  
    6. {  
    7. q.SetLookRotation(obj1.position, obj2.position);  
    8. transform.rotation = q;  
    9. }  
    效果:相似于LookAt()方法,使物体1始终注视着物体2

    4, static operator * (lhs : Quaternion, rhs : Quaternion) : Quaternion
    [csharp] view plaincopy
    1. public Transform extraRotation;  
    2.   
    3. void Update()  
    4. {  
    5. transform.rotation *= extraRotation.rotation;  
    6. }  
    效果:组合旋转lhs和rhs。旋转一个点,首先用lhs。然后用rhs旋转,与使用组合旋转同样。注意旋转不可交换: lhs*rhs不等于rhs*lhs。 我理解旋转的角度就是将*号两边的角度加起来。



    5,static operator * (rotation : Quaternion, point : Vector3) : Vector3

    [csharp] view plaincopy
    1. Vector3 relativeDirection = Vector3.forward;  
    2. Vector3 absoluteDirection;  
    3.   
    4. void Update () {  
    5. absoluteDirection = transform.rotation * relativeDirection;  
    6. transform.position += absoluteDirection * Time.deltaTime;  
    7. }  

    效果:将一个向量依据rotation旋转到还有一个向量。


    6。static function Dot (a : Quaternion, b : Quaternion) : float
    效果:将两个Quaternion点乘,返回一个float值,意义待补充。

    7,static function AngleAxis (angle : float, axis : Vector3) : Quaternion 

    [csharp] view plaincopy
    1.  void Start(){  
    2.         transform.rotation = Quaternion.AngleAxis(30, Vector3.up);  
    3. }  
    效果:将物体绕axis旋转angle度。


    8。static function FromToRotation (fromDirection :Vector3, toDirection :Vector3) : Quaternion 

    [csharp] view plaincopy
    1. transform.rotation = Quaternion.FromToRotation(Vector3.up, transform.forward);  
    效果:跟SetFromToRotation几乎相同,差别是能够返回一个Quaternion。通经常使用来让transform的一个轴向(比如 y轴)与toDirection在世界坐标中同步。



    9,static function LookRotation (forward :Vector3, upwards :Vector3 =Vector3.up) : Quaternion

    效果:跟SetLootRotation几乎相同,差别是能够返回一个Quaternion。


    10,static function Slerp (from : Quaternion, to : Quaternion, t :float) : Quaternion 

    [csharp] view plaincopy
    1. public Transform from;  
    2. public Transform to;  
    3. public float speed = 0.1F;  
    4. void Update() {  
    5.     transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.time * speed);  
    6. }  
    效果:球面插值,插值不是等角速度的。而是变速的。 会有越来越慢的感觉。


    11,static function Lerp (from : Quaternion, to : Quaternion, t :float) : Quaternion 

    效果:与Slerp效果几乎相同,效率比Slerp高可是假设from和to相差过大效果会不好,会返回一个标准化的Quaternion。


    12,static function RotateTowards (from : Quaternion, to : Quaternion, maxDegreesDelta :float) : Quaternion

    效果:旋转一个角度从from向to。与Slerp基本同样,但这个函数的角速度永远不会超过maxDegreesDelta。负的maxDegreesDelta值将使旋转远离to。


    13。static function Inverse (rotation : Quaternion) : Quaternion 

    效果:返回反向的旋转。


    14,static function Angle (a : Quaternion, b : Quaternion) :float

    [csharp] view plaincopy
    1. public Transform target;  
    2. void Update(){  
    3.      float angle = Quaternion.Angle(transform.rotation, target.rotation);  
    4. }  


    效果:返回a和b两者之间的角度。


    15,static function Euler (x :float, y :float, z :float) : Quaternion .

    [csharp] view plaincopy
    1. public Quaternion rotation = Quaternion.Euler(0, 30, 0);  

    效果:把旋转角度变成相应的Quaternion。


    三,实例

    [javascript] view plaincopy
    1. var target : Transform;  
    2. var edgeBorder = 0.1;  
    3. var horizontalSpeed = 360.0;  
    4. var verticalSpeed = 120.0;  
    5. var minVertical = 20.0;  
    6. var maxVertical = 85.0;  
    7.   
    8. private var x = 0.0;  
    9. private var y = 0.0;  
    10. private var distance = 0.0;  
    11.   
    12. function Start()  
    13. {  
    14.     x = transform.eulerAngles.y;  
    15.     y = transform.eulerAngles.x;  
    16.     distance = (transform.position - target.position).magnitude;  
    17. }  
    18.   
    19. function LateUpdate()  
    20. {  
    21.     var dt = Time.deltaTime;  
    22.     x -= Input.GetAxis("Horizontal") * horizontalSpeed * dt;  
    23.     y += Input.GetAxis("Vertical") * verticalSpeed * dt;  
    24.       
    25.     y = ClampAngle(y, minVertical, maxVertical);  
    26.        
    27.     var rotation = Quaternion.Euler(y, x, 0);  
    28.     var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;  
    29.     //print(rotation + " && " + rotation * Vector3(0.0, 0.0, -distance));  
    30.     transform.rotation = rotation;  
    31.     transform.position = position;  
    32. }  
    33.   
    34. static function ClampAngle (angle : float, min : float, max : float) {  
    35.     if (angle < -360)  
    36.         angle += 360;  
    37.     if (angle > 360)  
    38.         angle -= 360;  
    39.     return Mathf.Clamp (angle, min, max);  
    40. }  
    很有意思的一个样例,来自Unity官方projectShadowDemoProject,效果是能够通过键盘使摄像机环绕一点自由旋转。相似于在一个球面上运动。

    [javascript] view plaincopy
    1. var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;  
    这一句很有意思。也很难理解,全然理解了这一句后,Quaternion在你手里会变的很强大。
  • 相关阅读:
    for xml path(''),root('')
    [小明带你玩儿Photon]4.一起来看日志
    [小明带你玩儿Photon]3.Hello World i
    [小明带你玩儿Photon]2.从零开始一个程序
    [小明带你玩儿Photon]1.Photon介绍
    杂记
    FluentNHibernate初探[1]
    [Navigation]Navigation初探[2]
    [Navigation]Navigation初探[1]
    动画系统的animator
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/9968577.html
Copyright © 2020-2023  润新知