unity3d————四元数概念

news2024/11/25 20:43:44

一、定义与表示

四元数是由一个实数部分和三个虚数部分组成,通常表示为q = w + xi + yj + zk,其中w是实数,x、y、z是实数系数,i、j、k是虚数单位,满足以下关系:

  • i² = j² = k² = -1
  • ij = k,ji = -k
  • jk = i,kj = -i
  • ki = j,ik = -j

四元数也可以表示为q = [w, v],其中v = (x, y, z)是矢量,w是标量。虽然v是矢量,但它不能简单地理解为3D空间的矢量,而是在4维空间中的矢量。

二、几何意义与旋转

四元数中的i、j、k可以理解为一种旋转,其中:

  • i旋转代表Z轴与Y轴相交平面中Z轴正向向Y轴正向的旋转。
  • j旋转代表X轴与Z轴相交平面中X轴正向向Z轴正向的旋转。
  • k旋转代表Y轴与X轴相交平面中Y轴正向向X轴正向的旋转。
  • -i、-j、-k分别代表i、j、k旋转的反向旋转。

因此,四元数可以用来描述一个旋转轴和一个旋转角度。具体来说,一个四元数q可以执行一个旋转,将空间中的一个点P绕着单位向量轴u旋转θ角度。这个旋转可以通过将点P扩展到四元数空间,然后应用四元数乘法p' = qpq-1是q的共轭四元数。

三、性质与运算

四元数具有一些独特的性质和运算规则,包括:

  • :四元数的模定义为|q| = √(w² + x² + y² + z²),它表示四元数到原点的距离。
  • 共轭四元数:四元数的共轭定义为q* = w - xi - yj - zk。共轭四元数在旋转计算中起到关键作用。
  • 逆四元数:四元数的逆定义为q^-1 = q* / |q|²。只有当四元数为单位四元数(即模为1的四元数)时,其逆才等于其共轭。
  • 乘法:四元数的乘法不满足交换律,但满足结合律和分配律。四元数乘法的结果仍然是一个四元数,且可以用来合并旋转。

四、应用

四元数在计算机图形学、机器人学、航空航天等领域有广泛应用。与传统的欧拉角或旋转矩阵相比,四元数提供了一种更稳定、更高效的方式来处理三维旋转。它们可以避免欧拉角存在的万向锁(Gimbal Lock)问题,并且在进行多次旋转运算时不会积攒误差。此外,四元数还非常适合于旋转的插值计算,在动画和飞行模拟等领域有广泛应用。

五、总结

综上所述,四元数是一种在三维空间中表示旋转的数学结构,由实数部分和三个虚数部分组成。它们具有独特的性质和运算规则,并广泛应用于计算机图形学、机器人学等领域。四元数的引入为三维旋转的表示和处理提供了新的思路和方法。

上面概念大家大概看一下了解就行,想要深入了解可以自己查询相关数学知识,接下来就是unity3d部分,我们直接上代码
 

public class siyuanshu : MonoBehaviour
{
    void Start()
    {
        //创建一个四元数
        Quaternion q = Quaternion.AngleAxis(60, Vector3.right);
        //创建一个游戏对象  把四元数赋值给他
        GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
        obj.transform.rotation = q;
    }
}

运行结果:

 

                                       

                                

  1. 创建一个四元数

    Quaternion q = Quaternion.AngleAxis(60, Vector3.right);

    这行代码创建了一个四元数q,它表示一个围绕X轴(在Unity中,Vector3.right代表X轴的正方向)旋转60度的旋转。Quaternion.AngleAxis方法接受两个参数:一个是旋转的角度(以度为单位),另一个是旋转轴(一个Vector3向量)。这里,旋转轴是X轴,角度是60度。

  2. 创建一个游戏对象

    GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);

    这行代码使用GameObject.CreatePrimitive方法创建了一个新的游戏对象,这个对象是一个立方体(PrimitiveType.Cube)。新创建的游戏对象会被自动添加到当前的Unity场景中,并且其位置默认在场景的原点(0,0,0)。

  3. 把四元数赋值给游戏对象的旋转

    obj.transform.rotation = q;

    这行代码将之前创建的四元数q赋值给新创建的立方体游戏对象的transform.rotation属性。这意味着立方体将会被旋转,以匹配四元数q所表示的旋转。具体来说,立方体将会围绕其自身的X轴旋转60度。

 

API讲解: 

public static Quaternion AngleAxis(float angle, Vector3 axis);

参数

  • angle (float):要旋转的角度,以度为单位。正值表示按顺时针方向旋转(根据右手定则),负值表示按逆时针方向旋转。
  • axis (Vector3):旋转所围绕的轴,该轴应该是一个归一化(即长度为1)的向量。如果提供的轴不是归一化的,Unity 会自动将其归一化,但这可能会引入一些微小的数值误差,因此最好自己预先归一化轴。

返回值

  • 返回一个 Quaternion,表示围绕指定轴旋转指定角度的旋转。

用法

  • Quaternion.AngleAxis 常用于创建表示特定旋转的四元数,这些旋转可以随后应用于游戏对象(GameObject)的 Transform 组件,以改变其方向。

 public static GameObject CreatePrimitive(PrimitiveType type);

参数

  • type (PrimitiveType):这是一个枚举类型,指定了要创建的基本几何体的类型。PrimitiveType 枚举包含了多种几何体类型,如 Cube(立方体)、Sphere(球体)、Cylinder(圆柱体)、Capsule(胶囊体)、Plane(平面)、Quad(四边形)等。

返回值

  • 返回一个 GameObject,它是新创建的基本几何体的实例。这个 GameObject 包含了表示几何体的 MeshRenderer 组件和 MeshFilter 组件,以及用于定位、旋转和缩放的 Transform 组件。

用法

  • CreatePrimitive 方法通常用于在脚本中动态添加几何体到场景中,特别是在需要根据游戏逻辑动态生成内容的情况下。

public Quaternion rotation { get; set; } 

rotation属性的特点:

  1. 类型Quaternion,这是一个用于表示三维旋转的四元数结构。

  2. 可读写:你可以通过transform.rotation来获取当前游戏对象的旋转状态,也可以通过给它赋值来设置新的旋转。

  3. 影响:改变transform.rotation的值会立即影响游戏对象在场景中的方向。

  4. 避免万向锁:与欧拉角(Euler angles)相比,四元数在表示旋转时不会遇到万向锁(gimbal lock)的问题,这使得它成为三维旋转的理想选择。

  5. 组合旋转:四元数支持乘法运算,这意味着你可以将多个旋转组合在一起,得到一个总的旋转效果。例如,transform.rotation = rotationA * rotationB; 会将rotationB应用到rotationA上,得到一个新的旋转,并将其赋值给transform.rotation

  6. 插值:在动画和过渡效果中,四元数插值(如Quaternion.LerpQuaternion.Slerp)允许你平滑地在两个旋转之间过渡。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2235314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据分库分表方案

分库分表介绍 分库分表应用场景 分库分表介绍 大数据分库分表是一种数据库架构技术,旨在应对大数据量场景下的数据库性能瓶颈。以下是对大数据分库分表的详细解释: 一、定义与背景 定义: 分库:将一个大型数据库按照一定的规则…

可重入函数 volatile SIGCHLD

目录 1. 可重入函数2. volatile3. SIGCHLD 信号 1. 可重入函数 场景:当我们在全局区定义一个链表(不带头结点),然后对链表做头插结点的操作,即插入 node1 结点(如上图所示)。在插入 node1 时需要…

『VUE』20. 组件嵌套关系page(详细图文注释)

目录 VUE的自带组件结构新建文件搭建结构app与Main Header Aside结构App.vueHeader.vueMain.vueAside.vue Main 与Article.Aside与Item结构Article.vueItem.vue 总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 因为前面已经有…

【Hive sql面试题】找出连续活跃3天及以上的用户

表数据如下: 要求:求出连续活跃三天及以上的用户 建表语句和插入数据如下: create table t_useractive(uid string,dt string );insert into t_useractive values(A,2023-10-01 10:10:20),(A,2023-10-02 10:10:20),(A,2023-10-03 10:16…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-16

文件下载与邀请翻译者 学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么&#xff…

Vulnhub靶机——DC-3

#环境准备 dc-3 虚拟机:网卡NAT模式 kali攻击机:网卡NAT模式 #信息收集 nmap轻车熟路扫一下dc3的地址,识别出joomla系统 面向百度渗透,得知有一个joomla的扫描器,直接安排上,这下有版本号和后台登录地址…

数据结构:七种排序及总结

文章目录 排序一插入排序1直接插入排序2希尔排序二选择排序3直接选择排序4堆排序三 交换排序5冒泡排序6快速排序四 归并排序7归并排序源码 排序 我们数据结构常见的排序有四大种,四大种又分为七小种,如图所示 排序:所谓排序,就是…

基于STM32H7XX的Bootloader启动与FOTA

1. Bootloader是如何工作的: 2.正常情况下,程序从flash启动时的启动流程,如下图所示: 首先程序从flash启动,根据中断向量表找到复位中断处理函数的地址(0x0800 0004处是中断向量表的起始地址,记录了复位中断处理函数的地址)。执行复位中断处理函数,初始化系统环境之后…

语音 AI 迎来爆发期,也仍然隐藏着被低估的机会丨RTE2024 音频技术和 Voice AI 专场

在人工智能快速发展的今天,语音交互技术正经历一场革命性的变革。从语音识别到语音合成,再到端到端的语音对话系统,这一领域的创新正以前所未有的速度推进。这些进步不仅提升了技术指标,更为实时翻译、虚拟数字人、智能客服等实时…

【自学笔记】神经网络(1)

文章目录 介绍模型结构层(Layer)神经元 前向传播反向传播Q1: 为什么要用向量Q2: 不用激活函数会发生什么 介绍 我们已经学习了简单的分类任务和回归任务,也认识了逻辑回归和正则化等技巧,已经可以搭建一个简单的神经网络模型了。 …

在内蒙考驾照需要注意什么呢?

一、报名条件 年满18周岁,具有完全民事行为能力的中国公民。持有有效的身份证明文件。身体健康,无妨碍驾驶机动车的疾病,并需要通过体检。 二、选择驾校 可以先向身边已经拿到驾照的朋友咨询,了解驾校的距离、位置、口碑等信息。…

C++builder中的人工智能(8)什么是神经网络中的恒等激活函数?

在这篇文章中,我们将回答以下问题: 你想了解神经网络中最简单的激活函数是什么吗?什么是恒等函数?作为AI术语,我们需要了解激活函数和转移函数的哪些知识?激活函数与净输入函数是一回事吗?是否…

django图书管理系统-计算机毕业设计源码00648

摘要 图书管理系统在数字化阅读趋势、图书馆自动化管理、用户体验需求和信息技术应用等方面具有重要的研究意义。图书馆自动化管理系统的引入和应用提高了图书借阅过程的效率和准确性,减少了对手工操作和纸质记录的需求。用户对系统的易用性、查询速度、借还流程有更…

文件系统和日志管理

文件系统 文件系统: 文件系统提供了一个接口,用户用来访问硬件设备硬件设备上对文件的管理 存储单位 文件存储在硬盘上,硬盘最小的存储单位是512字节 扇区,文件在硬盘上的最小存储单位:块block,一个块的…

【代码转换】如何用 GPT 将 Python2代码 转换为 Python3代码 :实战教程

文章目录 1. 为什么要将 Python 2 代码迁移到 Python 3?2. 使用 ChatGPT 进行代码转换的步骤步骤1:打开CodeMoss步骤2:在输入框输入符号,选择代码转换步骤3:在这里选择你要更改的具体代码步骤4:准备 Python…

「Mac畅玩鸿蒙与硬件27」UI互动应用篇4 - 猫与灯的互动应用

本篇将带领你实现一个趣味十足的互动应用,用户点击按钮时猫会在一排灯之间移动,猫所在的位置灯会亮起(on),其余灯会熄灭(off)。应用会根据用户的操作动态更新灯光状态和文本提示当前亮灯的位置&…

ES海量数据插入如何优化性能?

2024年10月NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。百度文心快码总经理臧志分享了《AI原生研发新范式的实践与思考》,探讨了大模型赋能下的研发变革及如何在公司和行业中落地,AI原生研发新范式的内涵和推动经验。 …

OTFS基带通信系统(脉冲导频,信道估计,MP解调算法)

Embedded Pilot-Aided Channel Estimation for OTFS in Delay–Doppler Channels | IEEE Journals & Magazine | IEEE Xplore 一、OTFS通信系统 如下图简要概括了OTFS基带通信系统过程,废话不多说给出完整系统详细代码。 以下仿真结果基于四抽头信道 估计信道…

理解Web登录机制:会话管理与跟踪技术解析(二)-JWT令牌

JWT令牌是一种用于安全地在各方之间传递信息的开放标准,它不仅能够验证用户的身份,还可以安全地传递有用的信息。由于其结构简单且基于JSON,JWT可以在不同的系统、平台和语言间无缝传递,成为现代Web开发中不可或缺的一部分。 文章…

微积分复习笔记 Calculus Volume 1 - 4.8 L’Hôpital’s Rule

4.8 L’Hpital’s Rule - Calculus Volume 1 | OpenStax