unity3d————四元数概念

一、定义与表示

四元数是由一个实数部分和三个虚数部分组成,通常表示为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.xdnf.cn/news/5327.html

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

相关文章

利用frp进行SSH端口转发(内网穿透同理)

题记 公司内网有一台设备,可以根据微步情报来对恶意服务器进行封禁。很不幸我的vps因为开着cs被标记为恶意了,导致我在公司网络连不上我的vps,每次连还要挂代理。于是我打算将我vps的22端口转发到我们公司的vps的10022端口上。本篇文章来自11…

深度学习:bert框架

bert框架的介绍 BERT是一个基于Transformer的双向编码器表示模型,它通过预训练学习到了丰富的语言表示,并可以用于各种自然语言处理任务。 模型结构: BERT基于Transformer的编码器部分,采用了多层自注意力机制和前馈神经网络。这…

java ssm 防疫用地理位置分析系统 地理坐标系统 定位 源码 jsp

一、项目简介 本项目是一套基于SSM的防疫用地理位置分析系统,主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具等。 项目都经过严格调试,确保可以运行! 二、技术实现 ​后端技术&…

IDEA启动提示Downloading pre-built shared indexes

Download pre-built shared indexes Reduce the indexing time and CPU load with pre-built JDK shared indexes 翻译: 下载预构建的共享索引 使用预构建的JDK共享索引减少索引时间和CPU负载. 使用预构建的JDK共享索引可以显著减少索引构建时间和CPU负载&#xf…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第7天,申请阿里云SMS短信服务SDK

系列专栏链接如下,方便跟进: https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_link 同时篇幅…

MySQL8完全卸载方法-Win10系统

今天分享一篇win10系统下,如何完整的卸载MySQL8 第一步:关闭服务 services.msc 随后右键,点击“停止”,这时候通过cmd命令窗口进入MySQL,检测是否关闭成功 mysql -u root -p 如果提示:ERROR 2003(HY000) ca…

使用kalibr_calibration标定相机(realsense)和imu(h7min)

vslam-evaluation/VINS/Installation documentation/4.IMU和相机联合标定kalibr_calibration.md at master DroidAITech/vslam-evaluation GitHub 目录 1.kalibr安装 1.1安装依赖项 1.2创建工作空间 1.3下载kalibr并编译 1.4设置环境变量 2.准备标定板 3.配置驱动和打…

香港航空 阿里滑块 acw_sc__v3 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我删…

两场核工业盛会召开!VirtualFlow亮相助力核电CFD技术革新

金秋十月,北京迎来了两场核电领域的年度盛会——“中国核学会核反应堆热工流体力学分会第四届学术年会”与“中核核能软件与数字化反应堆工程技术研究中心学术年会暨数字核能2024技术论坛”。来自全国80余家科研院所、高校和企业的800余名专家学者齐聚一堂&#xff…

Linux(CentOS)安装 MySQL

CentOS版本:CentOS 7 MySQL版本:MySQL Community Server 8.4.3 LTS 1、下载 MySQL 打开MySQL官网:https://www.mysql.com/ 直接下载网址:https://dev.mysql.com/downloads/mysql/ 其他版本 2、上传 MySQL 文件到 CentOS&#x…

【Golang】sql.Null* 类型使用(处理空值和零值)

sql.NullString 和 sql.NullInt64 类型(以及其他类似的 sql.Null* 类型)在处理数据库操作时非常有用,尤其是在 Go 语言的 database/sql 包中。它们的主要用途包括: 表示 NULL 值: 在数据库中,NULL 表示“没…

wincc中全局脚本C(c语言脚本)的研究和解密

文章目录 前言一、分析 前言 很多时候我们在wincc中写全局脚本时会为自己的脚本添加密码,但很久很久以后再想修改密码忘记了怎么办呢。 一、分析 经过分析编码有了下面成功 ![请添加图片描述](https://i-blog.csdnimg.cn/direct/33baf91a49da410e82f16b4fbd746c48…

es自动补全(仅供自己参考)

elasticssearch提供了CompletionSuggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询效率,对于文档中字段的类型有一些约束: 查询类型必须是:completion 字段内容是多个补全词条形成的数组 P…

了解云计算工作负载保护的重要性及必要性

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求,而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端,保护他们的云工作负载(指所有部署的应用程序和服务)变得越来越重要。云工作负载保护&…

ArkTS中的组件基础、状态管理、样式处理、class语法以及界面渲染

一、组件基础 1.什么是ArkTS ArkTS是HarmoyOS优选的助力应用开发的语言,ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步的扩展,继承了TS所有的特性,是TS的超集。 扩展的能力如下: 基本语法 …

从 ES Kafka Mongodb Restful ... 取到 json 之后

json 是个好东西,它可以使用公共的文本形式承载了丰富的结构化数据的信息。现代很多技术都在喜欢使用 json 作为数据传输格式,比如 Elastic Search,Restful,Kafka 等,Mongodb 这类对性能较在意的技术则使用了二进制化的 json。 结构化的数据…

Rust-宏编程

巴山楚水凄凉地,二十三年弃置身。 怀旧空吟闻笛赋,到乡翻似烂柯人。 沉舟侧畔千帆过,病树前头万木春。 今日听君歌一曲,暂凭杯酒长精神。 ——《酬乐天扬州初逢席上见赠》唐刘禹锡 【哲理】翻覆的船只旁仍有千千万万的帆船经过&a…

抖音短视频矩阵源码/矩阵系统搭建/短视频矩阵系统源码开发知识分享

短视频矩阵系统架构解析 在构建短视频矩阵系统时,通常会采用三种核心的框架技术:Spring、Struts和Hibernate。每种框架都承担着不同的职责,共同支撑起系统的高效运行。 Spring框架:作为全栈式的Java开发平台,它提供了…

【docker】6. 镜像仓库/镜像概念

Docker Registry(镜像仓库) 什么是 Docker Registry 镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。 镜像仓库管理多个 Repository, Repository 通过命名来区分。…

AJAX 全面教程:从基础到高级

AJAX 全面教程:从基础到高级 目录 什么是 AJAXAJAX 的工作原理AJAX 的主要对象AJAX 的基本用法AJAX 与 JSONAJAX 的高级用法AJAX 的错误处理AJAX 的性能优化AJAX 的安全性AJAX 的应用场景总结与展望 什么是 AJAX AJAX(Asynchronous JavaScript and XML…