近期有用到四元数,学习了一下,对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); //返回于目标旋转相反的旋转值
}
}