欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > unity3d————四元数的计算

unity3d————四元数的计算

2024/11/30 6:38:41 来源:https://blog.csdn.net/2401_82978699/article/details/143620998  浏览:    关键词: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); // 001v = Quaternion.AngleAxis(45, Vector3.up) * v;  print(v);  //v = Quaternion.AngleAxis(45, Vector3.up) * v;print(v);  //100}

      运行结果:

四元数乘向量的作用

  • 当一个四元数(表示一个旋转)乘以一个向量时,结果是一个新的向量,这个新向量是原向量经过该四元数所表示的旋转后得到的。
  • 简单来说,四元数乘向量的操作实现了向量的旋转。

运算规则

  • 四元数乘向量的运算规则是右乘(Quaternion * Vector3),而不是左乘(Vector3 * Quaternion)。这是因为四元数乘法不满足交换律。

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com