unity3d————四元数的计算
1.四元数相乘
代码示例:
void Start()
{
Quaternion q = Quaternion.AngleAxis(20, Vector3.up);
this.transform.rotation *= q;
this.transform.rotation *= q;
}
我们首先创建一个四元数 q 根据 Quaternion.AngleAxis(20, Vector3.up); 返回一个四元数 ,先讲解api
public static Quaternion AngleAxis(float angle, Vector3 axis);
参数
- angle: 旋转的角度,以度为单位。正值表示顺时针旋转(从轴的负方向看向正方向),负值表示逆时针旋转。
- axis: 旋转的轴,是一个
Vector3
对象。这个轴不需要是单位向量(即长度为1的向量),方法内部会自动对其进行归一化处理。但是,为了避免潜在的数值问题,最好传入一个已经归一化的向量。
返回值
- 返回一个
Quaternion
对象,表示围绕指定轴旋转指定角度的旋转。
用法
Quaternion.AngleAxis
方法通常用于创建表示特定旋转的四元数,这个四元数随后可以用于旋转物体、计算旋转后的方向等。
注意事项
- 旋转的角度是以度为单位,而不是弧度。如果你习惯使用弧度,你需要将弧度转换为度(1 弧度 ≈ 57.2958 度)。
- 旋转轴会被归一化,所以即使你传入了一个长度不为1的向量,方法也会正确地计算旋转。但是,为了避免潜在的数值误差,最好还是传入单位向量。
- 四元数旋转是累积的,所以如果你连续应用多个
Quaternion.AngleAxis
创建的旋转,最终的结果将是所有这些旋转的组合。 - 在某些情况下,你可能会遇到“万向锁”(Gimbal Lock)的问题,这是在使用欧拉角(Euler Angles)进行旋转时可能出现的。使用四元数可以避免这个问题,因为它们提供了更稳定、更平滑的旋转表示。
- 参数axis 他代表的是物体的坐标系 不是世界坐标系 ;也就是说他只会围绕自己去旋转
运行结果:
我们发现面板的欧拉角显示很怪异 这个无需担心 因为里面的东西 不用在意 我们只需要关注实现我们的功能模块就行
2.四元数乘向量
代码示例:
void Start()
{
Quaternion q = Quaternion.AngleAxis(20, Vector3.up);
this.transform.rotation *= q;
this.transform.rotation *= q;
Vector3 v = Vector3.forward;
print(v); // 001
v = Quaternion.AngleAxis(45, Vector3.up) * v;
print(v); //
v = Quaternion.AngleAxis(45, Vector3.up) * v;
print(v); //100
}
运行结果:
四元数乘向量的作用
- 当一个四元数(表示一个旋转)乘以一个向量时,结果是一个新的向量,这个新向量是原向量经过该四元数所表示的旋转后得到的。
- 简单来说,四元数乘向量的操作实现了向量的旋转。
运算规则
- 四元数乘向量的运算规则是右乘(Quaternion * Vector3),而不是左乘(Vector3 * Quaternion)。这是因为四元数乘法不满足交换律。