unity中Quaternion和旋转

近期有用到四元数,学习了一下,对unity中用到的几种封装方法研究了一二,这里记录一下,底层的数学原理说实话还是有点懵逼的,这个等以后学习了3D数学之后,对矩阵和三维旋转有了一定的认识之后再来补充原理吧;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class QuaternionStudy : MonoBehaviour {

    private Quaternion _quater;
    private float jishiAngle;
    public Transform target;
    private Quaternion _rotation;
    Quaternion a, b;
    // Use this for initialization
    void Start () 
    {
         b = Quaternion.Euler(60, 60, 80);
    }

    // Update is called once per frame
    void Update () 
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            transform.eulerAngles = new Vector3(30,30,30); //给其欧拉角赋值
            print(transform.eulerAngles);
        }
        if (Input.GetKeyDown(KeyCode.W))
        {
            Quaternion a1 = Quaternion.identity;
            a1.eulerAngles = new Vector3(30,30,0);
            Quaternion a2 = Quaternion.identity;
            float angle= Quaternion.Angle(a1,a2);//返回两个四元素之间的角度
            print(angle);
        }
        if (Input.GetKeyDown(KeyCode.E))
        {
            transform.rotation = Quaternion.identity;//无旋转,只读
        }
        if (Input.GetKeyDown(KeyCode.R))
        {
           // transform.rotation = Quaternion.AngleAxis(30,transform.up);
            transform.rotation = Quaternion.AngleAxis(30, Vector3.up); //将对象的rotation从quaternion.identity变到当前状态,
            print(transform.rotation);                           //只需要其围绕axis轴(世界坐标系)旋转angle即可,自身坐标系不可
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            Quaternion a1 = Quaternion.identity;
            a1.eulerAngles = new Vector3(30, 30, 0);
            Quaternion a2 = Quaternion.identity;
            float angle = Quaternion.Dot(a1,a2);//计算两个rotation之间的点乘,看不出来怎么用,知道的朋友指导下;
            print(angle);
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
          // transform.rotation= Quaternion.Euler(30,30,40); //将对象的角度变成(30,30,40)
           transform.rotation = Quaternion.Euler(new Vector3(30,30,40));
           print(transform.rotation);
        }

        if (Input.GetKeyDown(KeyCode.F))
        {
          print(transform.rotation);
          print(Quaternion.Inverse(transform.rotation));
          transform.rotation = Quaternion.Inverse(transform.rotation); //返回相反的rotation,比如(0.1,0.2,0,1)相反就是(-0.1,-0.2,0,1)
        }

       // jishiAngle += Time.deltaTime*3;
      //  transform.eulerAngles = new Vector3(0,jishiAngle,0);//相当于旋转
        //Vector3 relativePos = target.position - transform.position;
       // Quaternion _rotation = Quaternion.LookRotation(relativePos);
       // _rotation.SetLookRotation(relativePos); //与lookrotation函数效果一样,不同的是lookrotation由quaternion直接点出来,而setlookrotation则是变量_rotation点出来
        //transform.rotation = _rotation; //旋转注视

      //  float step = Time.deltaTime * 3;
       // transform.rotation = Quaternion.RotateTowards(transform.rotation,target.rotation,step); //慢慢旋转至和目标rotation一致

        //Vector3 fromDirection = transform.eulerAngles;
        //Vector3 toDirection = target.eulerAngles;
        //transform.rotation = Quaternion.FromToRotation(transform.forward, Vector3.forward);

          // transform.rotation = Quaternion.Slerp(transform.rotation, b, Time.deltaTime*0.3f); //相当于旋转的功能; 插值,由快至慢渐变

       // transform.rotation = Quaternion.Inverse(target.rotation); //返回于目标旋转相反的旋转值
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity,四元数(Quaternion)是一种用于表示旋转的数据类型。它由四个实数构成,即(x, y, z, w),其前三个分量表示旋转轴的向量部分,而第四个分量表示旋转角度的标量部分。 Unity使用四元数来表示物体的旋转是因为它具有很多优点,例如避免万向节锁(Gimbal Lock)问题以及提供更高效的旋转计算。使用四元数可以执行平滑的插值和旋转操作,并且在进行多个旋转操作时不会出现旋转误差的累积问题。 在Unity,可以通过Quaternion类来创建和操作四元数。你可以使用Quaternion.Euler函数通过欧拉角(Euler angles)来创建一个四元数,也可以使用Quaternion.LookRotation函数通过指定的方向向量来创建一个四元数。此外,你还可以使用四元数的乘法运算来执行旋转的组合操作。 例如,要将一个物体绕着Y轴旋转90度,可以使用以下代码: ```csharp Quaternion rotation = Quaternion.Euler(0f, 90f, 0f); transform.rotation = rotation; ``` 这将把物体的旋转设置为绕着世界坐标系的Y轴旋转90度。 需要注意的是,Unity的四元数是归一化的,即它们的长度(模)始终为1。因此,如果你直接修改四元数的值,可能会导致旋转失效或产生意想不到的结果。通常情况下,建议使用旋转操作函数(如Rotate、RotateAround等)来进行旋转操作,而不是直接修改四元数的值。 总而言之,四元数是Unity一种用于表示旋转的强大数据类型,它提供了灵活而高效的旋转操作,使你可以在游戏开发实现各种复杂的旋转效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值