当前位置: 首页 > article >正文

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)。这是因为四元数乘法不满足交换律。

 


http://www.kler.cn/a/392414.html

相关文章:

  • 鸿蒙next版开发:ArkTS组件点击事件详解
  • 【vue2.0入门】vue基本语法
  • 【STM32F1】——无线收发模块RF200与串口通信
  • ArkTs简单入门案例:简单的图片切换应用界面
  • 丹摩征文活动|丹摩智算平台使用指南
  • 2024.11.12_大数据的诞生以及解决的问题
  • 【每日推荐】使用 Ollama 平台上的 Llama 3.2-vision 模型进行视频目标检测
  • 【PGCCC】Postgresql Toast 原理
  • Maven 构建项目
  • qt creator开发一个Linux 下运行的无界面的程序
  • 力扣617:合并二叉树
  • Cesium基础-(Entity)-(label )
  • 如何快速开发一套MES系统?
  • SpringBoot(八)使用AES库对字符串进行加密解密
  • 每日计划-1109
  • Git - 日志
  • Python+Appium编写脚本
  • TCP(上):成熟可靠的传输层协议
  • MySQL中指定字段的某个值排在前面
  • PET-文件包含-FINISHED
  • LeetCode每日一题1547---切棍子的最小成本
  • [Docker#6] 镜像 | 常用命令 | 迁移镜像 | 压缩与共享
  • ElegantRL:高效、稳定的深度强化学习开源框架
  • 力扣872:叶子相似的树
  • 架构师考试 五大架构风格
  • Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)