您的位置:首页 > 运维架构

operator*(lhs:Quaternion,rhs:Quaternion)和operator*(rotation:Quaternion, point:Vector3)使用解析

2014-09-16 22:50 375 查看
8.4 Quaternion类运算符

在Quaternion类中,涉及的运算符运算有两个Quaternion实例相乘的运算、一个Quaternion实例和一个Vector3相乘的运算,下面介绍这两种不同的运算。

8.4.1 operator* (lhs : Quaternion, rhs : Quaternion)

功能说明:此运算符用于返回两个Quaternion实例相乘后的结果。设A 和B均为GameObject对象的一个实例,有如下代码:

B.rotation *= A.rotation;

则:

(1)代码每执行一次,B会绕着B的局部坐标系的Z、X、Y轴分别旋转A.eulerAngles.z度、A.eulerAngles.x度和A.eulerAngles.y度,注意它们的旋转次序一定是先饶Z轴再绕X轴最后绕Y轴进行相应的旋转。另外由于是绕着局部坐标系的旋转,故而当绕着其中一个轴旋转时很可能会影响其余两个坐标轴方向的欧拉角(除非其余两轴的欧拉角都为0才不受影响)。

(2)设A的欧拉角为euler_a(ax,ay,az),则沿着B的初始局部坐标系的euler_a方向向下看,会发现B在绕着euler_a顺时针旋转。B的旋转状况还受其初始状态的影响,可以在运行示例程序时在Inspector面板中更改B的初始欧拉角查看运行状态的不同。

(3)此方法主要用于物体的自身旋转变换,若想进行自身移动变换请参operator * (rotation : Quaternion, point : Vector3)方法。

实例演示:下面通过实例演示两个Quaternion实例的相乘运算。

using UnityEngine;
using System.Collections;

public class QxQ_ts : MonoBehaviour {
public Transform A, B;

void Start () {
//设置A的欧拉角
//试着更改各个分量查看B的不同旋转状态
A.eulerAngles = new Vector3(1.0f,1.5f,2.0f);
}

void Update () {
B.rotation *= A.rotation;
//输出B的欧拉角,注意观察B的欧拉角变化
Debug.Log(B.eulerAngles);
}
}


在这段代码中,首先声明了两个Transform类型的变量,并在Start方法中对A的欧拉角进行赋值。然后在Update方法中将B.rotation与A.rotation相乘的值赋给B.rotation,从而实现B对象的不断旋转。请读者自行运行程序查看,图8-11是Debug输出截图,注意观察B的欧拉角的变化,B是绕着其自身坐标系的Vector3(1.0f,1.5f,2.0f)方向旋转,虽然每次绕这个轴向旋转的角度相同,但角度的旋转在三个坐标轴上的值都不为零,其中一轴的旋转都会影响其他两轴的角度,故而B的欧拉角的各个分量的每次递增值是不固定的。

8.4.2 operator* (rotation : Quaternion, point : Vector3)

功能说明:此运算符的作用是对参数坐标点point进行rotation变换。例如,设A为Vector3实例,有如下代码:

transform.position += transform.rotation *A;

则每执行一次代码,transform对应的对象便会沿着自身坐标系中向量A的方向移动A的模长的距离。transform.rotation与A相乘主要来确定移动的方向和距离。

实例演示:下面通过实例演示Quaternion与Vector3的相乘运算。

using UnityEngine;
using System.Collections;

public class QxV_ts : MonoBehaviour
{
public Transform A;
float speed = 0.1f;
//初始化A的position和eulerAngles
void Start()
{
A.position = Vector3.zero;
A.eulerAngles = new Vector3(0.0f, 45.0f, 0.0f);
}

void Update()
{
//沿着A的自身坐标系的forward方向每帧前进speed距离
A.position += A.rotation * (Vector3.forward * speed);
Debug.Log(A.position);
}
}


在这段代码中,首先声明一个变量A和初始化了一个变量speed,并在Start方法中对变量A的position和eulerAngles初始化。然后在Update方法中,使用Quaternion与Vector3相乘使得物体A沿着自身坐标系的forward方向每帧前进speed距离。请读者自行运行程序查看,图8-12是一张Debug输出截图。

8.5 关于operator* (lhs : Quaternion, rhs : Quaternion)和operator * (rotation :Quaternion, point : Vector3)的注解

设A为两个Quaternion实例的乘积,结果为Quaternion类型;B为Quaternion实例和Vector3的乘积,结果为Vector3类型,则:

(1)A与B的相似处是它们都是通过自身坐标系的”相乘”方式来实现在世界坐标系中的变换。

(2)A主要用来实现transform绕着自身坐标系中的某个轴进行旋转,而B主要是用来实现transform沿着自身坐标系的某个方向进行移动。

(3)B的相乘顺序只有Quaternion*Vector3形式,而没有Vector3*Quaternion形式。

(4)由于它们都是相对于自身坐标系进行的旋转或移动,故而当自身坐标系的轴向和世界坐标系的轴向不一致时,绕着自身坐标系中某个轴向的变动都会影响到物体在世界坐标系中各个坐标轴的变动。

本文章摘自图书《Unity API解析》,源码下载地址:http://www.ituring.com.cn/book/1474
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: