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); //返回于目标旋转相反的旋转值
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值