Quaternion类又称四元数,由x、y、z和w这4个分量组成,属于struct类型。在Unity中,用Quaternion来存储和表示对象的旋转角度。Quaternion的变换比较复杂,对于GameObject一般的旋转及移动,可以用Transform中的相关方法实现。本博客介绍Quaternion类的一些实例属性、静态方法和运算符,并对Quaternion类相乘运算符“*”的两种重载格式在功能上的异同进行了简要的注解。
文章目录
- 一、Quaternion类实例属性
- 1、基本语法
- 2、功能说明
- 3、代码实现
- 二、Quaternion类实例方法
- 1、基本语法
- 2、功能说明
- 3、代码实现
一、Quaternion类实例属性
在Quaternion类中,设计的实例属性主要有eulerAngles属性:欧拉角
1、基本语法
public Vector3 eulerAngles { get; set; }
2、功能说明
此属性用来返回或设置Quaternion实例对应的欧拉角
- 对GameObject对象的Transform进行欧拉角的变换次序是,先绕z轴旋转相应的角度,再绕x轴旋转相应的角度,最后再绕y轴旋转相应的角度。注意不同的旋转次序得到的最终状态是不同的
- 对GameObject独享的旋转角进行赋值的方式通常由两种:第一种是将Quaternion实例赋值给transform的rotation,第二种是将三维向量代表的欧拉角直接赋值给transform的eulerAngles
3、代码实现
下面通过实例演示属性eulerAngles的使用,创建一个立方体,将EulerAngle_test.cs挂载在立方体上,将A、B同时拖放物体给它赋值,对于公开的变量来说,Unity编辑器会在 Inspector面板自动实例这个类型默认的空物体,方便赋值,如果没赋值就使用变量 会报第错 “未赋值的引用异常”。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EulerAngle_test : MonoBehaviour
{
public Transform A, B;
Quaternion rotations = Quaternion.identity;
Vector3 eulerAngle = Vector3.zero;
float speed = 10.0f;
void Update()
{
//第一种方式:将Quaternion赋值给transform的rotation
rotations.eulerAngles = new Vector3(0.0f, speed * Time.time, 0.0f);
A.rotation = rotations;
//第二种方式:将三维向量代表的欧拉角直接赋值给transform的eulerAngles
eulerAngle = new Vector3(0.0f, speed * Time.time, 0.0f);
B.eulerAngles = eulerAngle;
}
}
二、Quaternion类实例方法
在Quaternion类中涉及的实例方法有SetFromToRotation
方法、SetLookRotation方法
和ToAngleAxis
方法,静态方法AngleAxis和实例方法TOAngleAxis功能相近
1、基本语法
public void SetFromTorotation(Vector3 fromDirection, Vector3 toDirection);
2、功能说明
此方法用于创建一个从fromDirection到toDirection的rotation,比如如下代码:
Quaternion q1 = Quaternion.identity;
q1.SetFromToRotation(v1,v2);
transform.rotation = q1;
则相当于将GameObject对象进行如下变换:首先将GameObject对象自身坐标系的x、y、z轴方向和世界坐标系x、y、z轴方向一致,然后将GAmeObject对象自身坐标系中向量y1指向的方向旋转到v2方向
notes:不可以直接及使用transform.rotation.SetFormToRotation(v1, v2)方式进行设置,只能将实例化的Quaternion赋值给transform.rotation
3、代码实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SetFromRotation_test : MonoBehaviour
{
public Transform A, B, C;
Quaternion q1 = Quaternion.identity;
void Update()
{
//不可直接使用C.rotation.SetFromToRotation(A.position,B.position);
q1.SetFromToRotation(A.position, B.position);
C.rotation = q1;
//在Scene面板中绘制直线
Debug.DrawLine(Vector3.zero, A.position, Color.red);
Debug.DrawLine(Vector3.zero, B.position, Color.green);
Debug.DrawLine(C.position, C.position + new Vector3(0.0f, 1.0f, 0.0f), Color.black);
Debug.DrawLine(C.position, C.TransformPoint(Vector3.up*1.5f),Color.yellow);
}
}