b站学习笔记
链接:https://www.bilibili.com/video/BV12s411g7gU?p=171
四元数概念
四元数变量
private void OnGUI()
{
if (GUILayout.Button(""))
{
//1.欧拉角 --> 四元数
//Quaternion.Euler(欧拉角);
//2.四元数 --> 欧拉角
Quaternion qt = this.transform.rotation;
Vector3 euler = qt.eulerAngles;
//3.轴/角
//Quaternion.Euler(0,50,0);
this.transform.rotation = Quaternion.AngleAxis(50, Vector3.up);
}
}
静态函数
public Transform tf;
if (GUILayout.Button("LookRotation"))
{
//Z轴指向一个方向
//4.当前物体注视tf旋转
Vector3 dir = tf.position - this.transform.position;
this.transform.rotation = Quaternion.LookRotation(dir);
//this.transform.LookAt(tf);
}
if (GUILayout.RepeatButton("Lerp"))
{
//5.差值旋转Lerp
Quaternion dir = Quaternion.LookRotation(tf.position - this.transform.position);
this.transform.rotation=Quaternion.Lerp(this.transform.rotation,dir,0.1f);
}
if (GUILayout.RepeatButton("RotateTowards"))
{
//6.匀速旋转
Quaternion dir = Quaternion.LookRotation(tf.position - this.transform.position);
this.transform.rotation = Quaternion.RotateTowards(this.transform.rotation, dir, 0.1f);
}
if (GUILayout.RepeatButton("Angle"))
{
//Lerp无限接近但达不到终点 如果用Lerp达到终点如何做?
Quaternion dir = Quaternion.LookRotation(tf.position - this.transform.position);
this.transform.rotation = Quaternion.Lerp(this.transform.rotation, dir, 0.1f);
//7.判断角度差
//如果当前旋转角度 接近目标旋转角度
if (Quaternion.Angle(this.transform.rotation,dir)<1)
{
this.transform.rotation = dir;
}
}
if (GUILayout.RepeatButton("right"))
{
//8.x轴注视旋转 t1
//this.transform.right = tf.position - this.transform.position;
//x轴正方向-->注视目标位置的方向
Quaternion dir= Quaternion.FromToRotation(Vector3.right,tf.position-this.transform.position);
this.transform.rotation = dir;
//如需慢慢转,可调Lerp
}
}
练习:根据用户输入的方向旋转角色,并向前移动
public float moveSpeed = 5;
public float rotateSpeed = 2;
private void Update(){
float hor = Input.GetAxis("Horizontal"); //a d
float ver = Input.GetAxis("Vertical"); //w s
if(hor!=0 || ver!=0)
MovementRotateion(hor,ver);
}
private void MovementRotateion(float hor,float ver){
Quaternion dir = Quaternion.LookRotation(new Vectoe3(hor,0,ver));
this.transform.rotation = Quaternion.Lerp(this.transform.rotation,dir,Time.deltaTime*rotateSpeed);
this.transform.Translate(0,0,Time.deltaTime*moveSpeed);
}