zoukankan      html  css  js  c++  java
  • Unity

    前言

    本文梳理了Unity中常用的旋转方法,涉及两大类:Transform、Quaternion。

    Transform 类

    Rotate()

    此方法重载多,易理解,在连续动态旋转中较为常用。

    /* 
        objsTrans[]为多物体的Transform组件,下标从1开始
        direction为(0,0,36)、Speed为1;
        初始时,1、2、4物体的rotation=(0,0,0),3、5、6物体的rotation=(180,0,0),其余均为默认值
    */
    
    // Rotate(Vector3 eulerAngles):以欧拉角旋转
    objsTrans[1].Rotate(direction * Speed * Time.fixedDeltaTime);
    
    // Rotate(Vector3 axis, float angle):绕axis轴,旋转angle度
    objsTrans[2].Rotate(Vector3.forward, 36 * Speed * Time.fixedDeltaTime);
    
    // Rotate(Vector3 eulerAngles, Space relativeTo):以欧拉角旋转,但参照的是本地坐标系
    objsTrans[3].Rotate(direction * Speed * Time.fixedDeltaTime, Space.Self);
    
    // Rotate(float xAngle, float yAngle, float zAngle):绕各轴旋转 X angle度
    objsTrans[4].Rotate(0, 0, 36 * Speed * Time.fixedDeltaTime);
    
    // Rotate(Vector3 axis, float angle, Space relativeTo):绕axis轴,旋转angle度,但参照的是本地坐标系
    objsTrans[5].Rotate(Vector3.forward, 36 * Speed * Time.fixedDeltaTime, Space.Self);
    
    // Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo):绕各轴旋转 X angle度,但参照的是本地坐标
    objsTrans[6].Rotate(0, 0, 36 * Speed * Time.fixedDeltaTime, Space.Self);
    

    RotateAround()

    // RotateAround(Vector3 point, Vector3 axis, float angle):绕穿过世界坐标中的 point 的 axis 旋转 angle 度
    objsTrans[1].RotateAround(Vector3.zero, Vector3.forward, 36 * Speed * Time.fixedDeltaTime);
    

    eulerAngles

    以欧拉角表示的旋转(以度为单位),是一个 Vector3类型的属性

    // 设定物体的欧拉角(本质为四元数)为 (0,0,90)
    objsTrans[1].eulerAngles = new Vector3(0, 0, 90);
    

    LookAt()

    这是比较常用的一个旋转类的函数,比如敌人、场景的AI等。其功能是 旋转物体、使其z轴始终指向目标物体。target、worldPosition参数为目标物体信息,worldUp参数较为特殊,涉及旋转时自身坐标系与世界坐标系的约束问题(见下图对比)。

    LookAt(Transform target);
    LookAt(Vector3 worldPosition);  
    LookAt(Transform target, Vector3 worldUp = Vector3.up);  
    LookAt(Vector3 worldPosition, Vector3 worldUp = Vector3.up);  
    

    Quaternion 类

    四元数用于表示旋转,所有的 rotation都为Quaternion类型,没有Vector3类型的 eulerAngles 直观,但其不受万向锁影响,可以轻松插值运算。

    eulerAngles

    四元数的欧拉角形式,原有的转换为欧拉角的方法如ToEuler()、ToEulerAngle()已被弃用。。

    Quaternion quaternion = new Quaternion { eulerAngles = new Vector3(0, 0, 90) };
    objsTrans[1].rotation = quaternion;   // 直接设定物体的rotation(即四元数)为 (0,0,90)
    

    AngleAxis

    用法非常类似上述对rotation赋值,其本质是 函数创建并返回一个四元数,进行赋值

    //Quaternion AngleAxis(float angle, Vector3 axis):绕 axis轴,旋转 angle 度
    objsTrans[1].rotation = Quaternion.AngleAxis(90, Vector3.forward);
    

    SetLookRotation()

    功能类似Transform.LookAt(),但注意,此处View参数不是目标物体的坐标,而应是两者的矢量差(当前物体指向目标物体的矢量)。up含义同上文所提的worldUp。

    // SetLookRotation(Vector3 view);  
    // SetLookRotation(Vector3 view, Vector3 up= Vector3.up);  
    Quaternion quaternion = Quaternion.identity;
    quaternion.SetLookRotation(objsTrans[2].position-objsTrans[1].position);
    objsTrans[1].rotation = quaternion;	//使物体1看向物体2
    

    LookRotation()

    用法及含义同SetLookRotation()

    // LookRotation (Vector3 forward, Vector3 upwards= Vector3.up);
    Quaternion quaternion = Quaternion.LookRotation((objsTrans[2].position - objsTrans[1].position), Vector3.up);
    objsTrans[1].rotation = quaternion;
    

    SetFromRotation()

    直观理解:存在物体123,物体1以自身为中心,由12的向量旋转为13的向量;就像三物体处于扇形的三个端点,物体1旋转的度数为该扇形的圆心角。注意区别于LookAt()LookAt()方法是z轴始终指向目标物体,而该方法是12、13物体间的虚拟连线的方向变更,不涉及z轴朝向谁。

    // SetFromToRotation (Vector3 fromDirection, Vector3 toDirection):创建一个从 fromDirection 旋转到 toDirection 的旋转
    Quaternion quaternion = new Quaternion();
    quaternion.SetFromToRotation(objsTrans[2].position, objsTrans[3].position);	//设定初始和最终朝向坐标
    objsTrans[1].rotation = quaternion;
    

    Slerp()

    直观理解:物体1从物体2的rotation、进行插值旋转变为物体3的rotation。

    // Quaternion Slerp(Quaternion a, Quaternion b, float t):在 a 和 b 之间以球形方式插入 t。参数 t 被限制在 [0, 1] 范围内
    objsTrans[1].rotation = Quaternion.Slerp(objsTrans[2].rotation, objsTrans[3].rotation, Time.time);
    

    参考

  • 相关阅读:
    快速排序算法
    HDOJ(1005) Number Sequence
    HDOJ(1004) Let the Balloon Rise
    HDOJ(1003) Max Sum
    HDOJ(1002) A + B Problem II
    HDOJ(1001) Sum Problem
    HDOJ(1000) A + B Problem
    DeepFaceLab小白入门(5):训练换脸模型!
    DeepFaceLab小白入门(4):提取人脸图片!
    DeepFaceLab小白入门(3):软件使用!
  • 原文地址:https://www.cnblogs.com/SouthBegonia/p/12700062.html
Copyright © 2011-2022 走看看