Unity 常用旋转API

来源:互联网 发布:ios kvo监听数组变化 编辑:程序博客网 时间:2024/06/02 05:30

Unity中的旋转通常可以用Transform 直接控制 和 rotation 控制两种方式。

一、Transform控制(工程中的scene1)

1.1 Transform.Rotate

旋转某个角度

函数定义

public void Rotate(Vector3 eulerAngles);public void Rotate(Vector3 axis, float angle);public void Rotate(Vector3 eulerAngles, Space relativeTo);public void Rotate(float xAngle, float yAngle, float zAngle);public void Rotate(Vector3 axis, float angle, Space relativeTo);public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo);
这个函数通常用于Update函数中,用于不断的旋转。如下

void Update () {     //以每秒rotateSpeed的速度绕着y轴旋转     transform.Rotate(0, rotateSpeed * Time.deltaTime, 0);}
1.2 Transform.RotateAround

以某点为中心旋转。

函数定义

public void RotateAround(Vector3 axis, float angle);public void RotateAround(Vector3 point, Vector3 axis, float angle);
这个函数通常也在Update中,不断地围绕着点运动。如下:

void Update () {    //在Y轴以每秒rotateSpeed的速度围绕着transformCenter 旋转。    //这会改变物体的位置和旋转。    transform.RotateAround(transformCenter.position,Vector3.up,rotateSpeed * Time.deltaTime);}
1.3 Transform.eulerAngles

设置物体的欧拉角为某个度数

属性定义

public Vector3 eulerAngles { get; set; }
直接设置即可,一般不用于Update函数中递增。如下

void Update (){    //设置旋转角度为一个固定值    //旋转作为欧拉角度。    //x、y、z角代表绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度(这个顺序)。    //仅使用者这个变量读取和设置角度到绝对值。不要递增它们,当超过角度360度,它将失败。使用Transform.Rotate替代。    transform.eulerAngles = new Vector3(0,0,60);}

1.4 Transform.LookAt

旋转物体,使其朝向某个位置

函数定义

public void LookAt(Transform target);public void LookAt(Vector3 worldPosition);public void LookAt(Transform target, Vector3 worldUp);public void LookAt(Vector3 worldPosition, Vector3 worldUp);
简单例子:

public class SimpleRotate4 : MonoBehaviour{    public float rotateSpeed = 20;    public float moveSpeed = 4;    private float curY;    private bool moveDown = false;    public Transform transformCenter;    void Update ()   {       //这段代码只是让物体不断的上下运动       moveDown = moveDown ? curY > -4 : curY > 4;        curY -= moveDown ? Time.deltaTime * moveSpeed : -Time.deltaTime * moveSpeed;        transform.position = new Vector3(-2, curY, 0);        //朝向目标        //当该物体设置了LookAt并指定了目标物体时,该物体的z轴将始终指向目标物体        transform.LookAt(transformCenter);    }}

1.5 Transform.forward

强制改变z轴朝向。

属性定义

public Vector3 forward { get; set; }
例子:

public class SimpleRotate5 : MonoBehaviour{    public float rotateSpeed = 20;    public float moveSpeed = 4;    private float curY;    private bool moveDown = true;    public Transform transformCenter;    void Update ()    {        //这段代码只是让物体不断的上下运动        moveDown = moveDown ? curY > -4 : curY > 4;        curY -= moveDown ? Time.deltaTime * moveSpeed : -Time.deltaTime * moveSpeed;        transform.position = new Vector3(2, curY, 0);        //强制设置z轴朝向        //本例子和LookAt区别不大        transform.forward = transformCenter.position - transform.position;            }}


二、Rotation 与 Quaternion(对应scene2)

2.1 Quaternion.eulerAngles

四元数的欧拉角

属性定义

public Vector3 eulerAngles { get; set; }
实例

    void Update ()     {        //功能类似于 transform.eulerAngles = new Vector3(0,0,60);        //但是不能直接设置rotation.eulerAngles 需要一个完整的Quaternion        Quaternion q1 = Quaternion.identity;        q1.eulerAngles = new Vector3(0,60,0);        transform.rotation = q1;    }
2.2 Quaternion.SetFromToRotation (建议参考scene2场景来学习)

创建一个从fromDirection到toDirection的旋转

函数定义

public void SetFromToRotation(Vector3 fromDirection, Vector3 toDirection);
实例:

public class QuaternionRotate2 : MonoBehaviour{    public Transform A;    public Transform B;    public Transform C;    public float moveSpeed = 4;    private float curY;    private bool moveDown = false;    private Quaternion q1 = Quaternion.identity;    void Update ()     {        moveDown = moveDown ? curY > -4 : curY > 4;        curY -= moveDown ? Time.deltaTime * moveSpeed : -Time.deltaTime * moveSpeed;        B.position = new Vector3(4, curY, 0);        //创建一个从fromDirection到toDirection的旋转。        q1.SetFromToRotation(A.position,B.position);        C.rotation = q1;        Debug.DrawLine(Vector3.zero, A.position,Color.red);        Debug.DrawLine(Vector3.zero, B.position, Color.green);        Debug.DrawLine(C.position, C.position + new Vector3(0,2,0), Color.black);        Debug.DrawLine(C.position, C.TransformPoint(0,2,0), Color.blue);    }}
2.3 Quaternion.SetLookRotation

旋转物体到某个角度

函数定义

public void SetLookRotation(Vector3 view);public void SetLookRotation(Vector3 view, Vector3 up);
实例:

public class QuaternionRotate3 : MonoBehaviour {    private Quaternion q1 = Quaternion.identity;    public Transform transformCenter;    void Update ()     {        //相当于transform.LookAt        q1.SetLookRotation(transformCenter.position);        transform.rotation = q1;    }}

2.4 Quaternion.AngleAxis

函数定义

public static Quaternion AngleAxis(float angle, Vector3 axis);
围绕axis轴,旋转angle度。

实例:

void Update () {    //绕y轴旋转60度    transform.rotation = Quaternion.AngleAxis(60,Vector3.up);}
2.5 Quaternion.Slerp

球形插值。

函数定义

public static Quaternion Slerp(Quaternion a, Quaternion b, float t);
可以用于旋转值的不断靠近。如下:

public class QuaternionRotate5 : MonoBehaviour{    public Transform A;    public float rotateSpeed = 10;    void Update () {        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(A.position - transform.position), 0.8f);    }}

需要下载工程的可以点击下载



















0 0
原创粉丝点击