Unity学习笔记之——关于角度和方向

Unity中常用表示方向的方式

1.欧拉角

transform.eulerAngles

Transform.eulerAngles的官方文档

不要单独设置某个 eulerAngles 轴(例如,eulerAngles.x = 10;),这会导致偏差和不希望的旋转。 在将它们设置为新值时,请一次性设置所有 eulerAngles 轴

2.四元数

四元数旋转有个重要的特性就是:到达终止方向的旋转角度为旋转方向

例如起始位置为(0,0,0),绕Y轴旋转200度到(0,200,0),物体会顺时针旋转160度而不是逆时针旋转200度。

(1)四元数的球形插值

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

球形插值,通过t值from向to之间插值。可以理解为速度,通常取值为0< t <= 1


public class example : MonoBehaviour 
{
    public Transform from;
    public Transform to;
    public float speed = 0.1F;
    void Update() 
    {
        //可以把 speed * Time.time 理解成速度 * 时间 等于角位移
        transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.time * speed);
    }

}

在Unity里,tranform组件有一个变量名为rotation,它的类型就是四元数。

欧拉角和四元数的转换

原理:

    public Quaternion EulerToQuaternion(float xx, float yy, float zz)
    {
 
        float X = xx / 180 * Mathf.PI;
        float Y = yy / 180 * Mathf.PI;
        float Z = zz / 180 * Mathf.PI;
        float x = Mathf.Cos(Y / 2) * Mathf.Sin(X / 2) * Mathf.Cos(Z / 2) + Mathf.Sin(Y / 2) * Mathf.Cos(X / 2) * Mathf.Sin(Z / 2);
        float y = Mathf.Sin(Y / 2) * Mathf.Cos(X / 2) * Mathf.Cos(Z / 2) - Mathf.Cos(Y / 2) * Mathf.Sin(X / 2) * Mathf.Sin(Z / 2);
        float z = Mathf.Cos(Y / 2) * Mathf.Cos(X / 2) * Mathf.Sin(Z / 2) - Mathf.Sin(Y / 2) * Mathf.Sin(X / 2) * Mathf.Cos(Z / 2);
        float w = Mathf.Cos(Y / 2) * Mathf.Cos(X / 2) * Mathf.Cos(Z / 2) + Mathf.Sin(Y / 2) * Mathf.Sin(X / 2) * Mathf.Sin(Z / 2);
        Quaternion quataion = new Quaternion(x, y, z, w);
        return quataion;
    }

    public Vector3 QuaternionToEuler(float xx, float yy, float zz, float ww)
    {
        float X = Mathf.Asin(2 * (ww * xx - yy * zz));
        float Y = Mathf.Atan2(2 * (ww * yy + xx * zz), 1 - 2 * (xx * xx + yy * yy));
        float Z = Mathf.Atan2(2 * (ww * zz + yy * xx), 1 - 2 * (xx * xx + zz * zz));
        Vector3 euler = new Vector3(X * 180f / Mathf.PI, Y * 180f / Mathf.PI, Z * 180f / Mathf.PI);
        return euler;
    }

方法:

//EulerToQuaternion
Quaternion.Euler(transform.eulerAngles),
//QuaternionToEuler
q.eulerAngles

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值