首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Unity中使用四元数计算旋转时,它使用q* transform.rotation,为什么不使用q* transform.rotation *q^ (-1)?

在Unity中使用四元数计算旋转时,它使用q * transform.rotation而不是q * transform.rotation * q^(-1)是因为四元数乘法是非交换的。具体来说,四元数表示了旋转的方向和角度,而乘法操作则表示了连续旋转的组合。

在Unity中,transform.rotation表示了当前对象的旋转状态,而q表示了要进行的额外旋转。因此,使用q * transform.rotation可以将额外旋转应用于当前对象的旋转状态,得到最终的旋转结果。

另一方面,如果使用q * transform.rotation * q^(-1),这实际上是将当前对象的旋转状态与q的逆运算相乘,然后再与q相乘。这样做会导致旋转的顺序发生变化,得到的结果可能与预期不符。

综上所述,使用q * transform.rotation能够正确地将额外旋转应用于当前对象的旋转状态,而不使用q * transform.rotation * q^(-1)可以避免旋转顺序错误的问题。

关于四元数的更多信息和使用方法,可以参考腾讯云的Unity文档:

  • Unity四元数概念介绍:https://cloud.tencent.com/document/product/1112/36961
  • Unity四元数类Quaternion的API文档:https://cloud.tencent.com/document/product/1112/36962
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Unity3D的Quaternion(四元

Unity3D的Quaternion(四元) 四元的概念 四元,这是一个图形学的概念,一般没怎么见过,图形学中比较常见的角位移的表示方法有“矩阵”、“欧拉角”、“四元”这三种...好了,上面我们就基本清楚四元的作用以及好处与坑了,下面开始正式讲讲Unity我们如何使用一些常见的四元操作。...Unity的四元 基本的旋转,我们可以通过Transform.Rotate来实现,但是当我们希望对旋转角度进行一些计算的时候,就要用到四元Quaternion了。...unity3d, quaternion 的乘法操作 (operator * ) 有两种操作: (1) quaternion * quaternion , 例如 q = t * p; 这是将一个点先进行...代表世界坐标系或者父物体坐标系的无旋转方位。

6.1K30

Unity基础(17)-四元与欧拉角与矩阵

Unity中表示旋转有三种方式:四元,欧拉角,矩阵 一、四元 1、概念 Quaternion存放了x,y,z,w四个数据成员,可以用下标来进行访问,对应的下标分别是0,1,2,3 其实最简单来说...Unity四元API 1.来把角度转化为相应四元素 Quaternion rot=Quaternion.Euler(30,60,90); 旋转顺序是,先绕Z轴转动90度,再绕X轴转动30度,最后绕Y...= rot * transform.rotation; 此游戏对象自身转向这个计算出来的偏转角所对应的四元,如果将此至于Update中就可以做到不断对准目标 6.创建一个让Z轴正方向和Y轴正方向指向规定方向的旋转...unity对向量应用旋转使用的是向量右乘,即如下: Vector3 newV = qxyz3*v=qz3*qy3*qx3*v; 四元实例 eulerAngles public class EulerAngle...当f = ±1 q1q2对应的欧拉角是相等的,Game视图中看他们旋转状态是一样的。

4.9K33
  • Unity精华☀️三、四元(Quaternion)解决万向锁

    本节为Unity万向锁系列的最后一节, 这一节我们就来解决这个难题:使用四元旋转,避免Unity万向锁。...(1,1,1); } 优点: 很容易理解,形象直观; 表示更方便,只需要3个值(分别对应x、y、z轴的旋转角度);但按我的理解,它还是转换到了3个3*3的矩阵做变换,效率不如四元; 缺点: 之前提到过这种方法是要按照一个固定的坐标轴的顺序旋转的...理论上,欧拉旋转可以靠这种顺序让一个物体指到任何一个想要的方向,但如果在旋转不幸让某些坐标轴重合了就会发生万向节锁,这时就会丢失一个方向上的旋转能力,也就是说在这种状态下我们无论怎么旋转(当然还是要原先的顺序...优点: 可以避免万向节锁现象; 只需要一个4维的四元就可以执行绕任意过原点的向量的旋转,方便快捷,某些实现下比旋转矩阵效率更高; 可以提供平滑插值; 四元遇到万向锁可提供平滑的差值运算...,因为多了一个维度; 理解更困难,直观; 四元旋转方法 1️⃣ Dotween,插值到目标欧拉角 Dotween的四元旋转,是先将要旋转到的目标欧拉角,转化为四元, 再进行旋转

    13610

    Unity基础(6)--资源管理(3)小赛车竞技

    上图是运行效果 1、导入游戏资源 1-1 导入标准资源包: 最后一个就是拥有车模型的资源包,而且导入Unity中会自动出现一个Standard Assets: Paste_Image.png Paste_Image.png...标准资源包里面就有车的模型: Paste_Image.png 其他资源是我自己下载的:可以加群(Q群:134688909)获取相关资源 Paste_Image.png 1-2让车能够移动 因为系统自带的车模型...所以直接拿来当轮子使用 Paste_Image.png 再搞一些跟随车辆:显得有竞技效果,此处也是使用系统资源 Paste_Image.png 2、搭建简单地形: 2-1创建地形 Paste_Image.png...suddenly shift direction //这个是为了避免万向锁问题的,万向锁问题会导致汽车突然变换方向(我直到万向锁问题,但不理解下面是怎么避免问题的,我只知道四元使用...就是为了避免万向锁问题) //下面这个If函数的效果就是,假如上一次车体Y方向角度比这次小于十度,就根据相差的度数乘以系数m_SteerHelper //计算出这个偏移角度的四元

    77020

    Unity3D】Unity 游戏画面帧更新 ( 游戏帧相关概念 | MonoBehaviour#Update() 帧更新方法 | 帧更新时间统计 | 设置游戏更新帧率 )

    Unity 的 C# 脚本的 MonoBehaviour#Update() 方法 就是 帧更新 的方法 , 每次 更新 画面帧 , 都会 调用该方法 , 也就是一秒钟调用几十次到一百多次 ; ...Unity 游戏中 , 如果要 更新 游戏物体 GameObject 的位置 , 就可以 Update 方法更新 游戏物体 GameObject 的坐标 ; using System.Collections... C# 脚本获取时间 : 下面的 时间单位是秒 , 类型是 float 类型 ; 获取游戏时间 : 游戏的绝对时间 , 使用 Time.time 获取 ; 获取更新时间差 : 获取 本次更新与上一次更新的时间差...Unity 无法精准的控制 游戏画面 的帧率 , 但是可以使用 Application.targetFrameRate = 5; 代码 , 为游戏画面更新 , 设置一个帧率 5 fps , Unity...Update 函数调用 , 游戏帧更新 , 当前游戏时间 : " + Time.time + " , 本次更新距离上次更新时间差 : " + Time.deltaTime); } } 执行结果 : 游戏画面更新

    1K20

    unity使用三种简单的方式实现实时时钟动画

    unity使用三种简单的方式实现实时时钟动画 ? 目标 这非常容易实现。你需要写几行代码就可以实现了。在这篇文章,我们将实现两种动画方式。 效果图 ?...数字时钟类型 模拟时钟类型 开始编码之前,我想要告诉你一些下面会用到的关于 unity 的知识。 什么是材质 unity ,材质是用来给一个对象的细节,所以我们可以决定它会看起来像什么。...大多数情况下,材料将以纹理为参数。 例如,如果你想给墙一个砖块纹理,那么你可以拖拽纹理到材质上。本例我们不会使用任何纹理,我们只使用颜色属性。我们有时也会给一个材质两个或更多的纹理。...public bool analog; 3.3 开始方法 Start 方法里,写下面的代码。 degreesInHour 将表示一小旋转多少度。...你可以检查模拟时钟的移动,看上去就像一个简单的时钟。 挑战 1.在这里,我们已经使用四元旋转变换,但有我们可以不使用四元数来完成变换吗?

    1.8K20

    Unity【Lerp & Slerp】- 线性插值与球形插值的区别

    Unity的向量Vector和四元Quaternion类,均包含线性插值Lerp和球形插值Slerp的函数,那么两者之间有何区别,通过下面的例子进行观察: 图一黄色线与红色线相交的点是从点...二者的区别从图中可以明显看出,从四元的角度来看,线性插值每帧得出的旋转结果是不均匀的,从代数的角度思考,如果两个单位四元之间进行插值,如图一的线性插值,得到的四元并不是单位四元,因此球形插值更为合理....Slerp(a.position, b.position, .9f)); } } 在对Transform组件的Position坐标和Rotation旋转进行插值运算, 通常用Vector3...的插值函数去处理Position,用Quaternion的插值函数去处理Rotation。...如果我们使用Vector3的插值函数去处理Rotation,则会出现如下这种情况: 代码如下: using UnityEngine; using System.Collections; public

    1.6K20

    Unity Metaverse(三)、Protobuf & Socket 实现多人在线

    文件 语法规则如下:•使用message定义类,相当于c#的class;•使用三种字段修饰符修饰字段:•required 表示是一个必选字段,必须初始化;•optional 表示是一个可选字段,可以不进行初始化...long 总是8个字节 bytes ByteString 字节数据 •字段标识号 每个字段都有唯一的标识号,这些标识是用来消息的二进制格式识别各个字段的,使用后便不能更改。...注:不可以使用[19000-19999]标识号,protobuf协议实现对这些进行了预留。...,也可以通过框架的Packaga Manager下载,EverySeconds表示每隔多少秒执行一次回调函数,这里我们将internal设为0.025,也就是1秒将发送40次数据,可适当调整。...instance.Init(ap); } //目标Avatar avatarDic[ap.UserId].Set(ap); } AvatarInstance接收到数据后,使用插值方式计算坐标

    1.1K20

    Unity3D】Unity 脚本 ④ ( 游戏物体 GameObject 的坐标 | 修改 游戏物体 GameObject 的本地坐标 )

    Inspector 检查器 显示的 Transform 组件 坐标值 , 这是常用的坐标 ; C# 脚本访问 游戏物体 GameObject 的 本地坐标 , 使用 this.gameObject.transform.localPosition...的本地坐标 ---- C# 脚本 , 调用 this.transform.localPosition 代码 , 获取的 本地坐标 类型是 Vector3 类型 , 这是一个 三维向量 , 由 3...Transform 组件 Transform transform = gameObject.transform; // 获取 Transform 组件的 位置 , 旋转量...缩放倍数 Debug.Log("C# 脚本附着游戏物体的 Transform 组件数据 位置 : " + transform.position + " , 旋转量...: " + transform.rotation + " , 缩放倍数 : " + transform.localScale); // 将 当前组件附着的 游戏物体 GameObject

    1.7K20

    Unity3d EasyAR开发案例系列教程

    (EasyAR就这点比较好,可以Unity里面看效果)。 以后的开发里也可以通过控制ImageTarget的激活和激活让物体显现和消失,抑或怎么去显现。...当显示完后,我们希望一直出现,所以我们需要处理的隐藏。..." 的基础上进行,首先我们需要到官网上下载并导入unity [这里写图片描述] 下载好后,我们将HelloAR unity 打开 [这里写图片描述] 下载好后,我们将HelloAR unity...###Step 1:准备 首先是关于识别图的准备,在这次的案例演示使用了如下的图片(二维码可以自己制作): [这里写图片描述] unity我们新建一个文件夹"StreamingAssets",.../s/1qYAyYL2 密码: 7jb2 ###Step 1:开发环境搭建 首先我们下载EasyAR SDK (unity版本)并导入到unity,并到官网申请开发所用到的Key值,unity

    2.9K50

    Unity3D】Android Studio 工程中使用 Java 代码调用 Unity 的 C# 脚本 ( Java 调用 UnityPlayer#UnitySendMessage 方法 )

    方法简介 三、 准备 C# 脚本 四、 Java 示例 一、 Java 调用 C# 依赖库准备 ---- 1、依赖库位置 Android 调用 Unity 的 C# 脚本 , 需要借助 Unity...官方提供的依赖库进行 ; Unity 编辑器的安装目录 , Y:\001_DevelopTools\029_Unity\Editor\2020.3.41f1c1\Editor\Data\PlaybackEngines...拷贝到要调用 C# 脚本的模块下 , 引入依赖即可使用 ; 将依赖库拷贝到 libs 目录下 , 右键点击依赖库 , 然后选择 Add as Library 选项 , 将其添加到依赖 ; 如果 ...Unity 导出的依赖库 , 会自动添加该依赖库 , unityLibrary libs 下的 unity-classes.jar 就是这个依赖库 ; 二、 Java 调用 C# 的 UnityPlayer...// 速度设置为 1 单位 / 秒 float speed = 1f; // 计算长度 , 速度 乘以 距离上次帧更新的时间差 float

    1.9K20

    unity3d:Matrix4x4矩阵位移,缩放,旋转

    二维坐标轴旋转公式推导 https://www.cnblogs.com/fangsmile/p/8622421.html 设点M原坐标系的坐标为(x,y),对应向量的模为r,幅角为α.将坐标轴绕坐标原点...,按照逆时针方向旋转角θ形成新坐标系,点M新坐标系的坐标为(如图2-4),则 由此得到坐标轴的旋转的坐标变换公式 矩阵旋转公式推导 https://www.cnblogs.com/wywnet...3D世界里,每个物体均有自身的世界矩阵,摄像机有摄像机矩阵,投影场景有projection矩阵,对顶点、向量、物体实施各种平移、旋转、缩放都是通过矩阵来完成的。...”)] public float m13; [NativeName(“m_Data[12]”)] public float m03; Matrix4x4.identity 单位矩阵 这个矩阵使用不会影响任何东西...的主对角线上全是1,其他位置全是0。

    63720

    Python 三维姿态估计+Unity3d 实现 3D 虚拟现实交互游戏

    实际应用,由于3D姿态估计2D姿态估计的基础上加入了深度信息,其对于人体姿态的表述比2D更为精准,因此其应用范围和研究价值都要高于2D人体姿态估计,但是3D姿态估计的难度也更高,存在着遮挡,单视角...目前的研究,三维人体姿态估计方法可以划分为传统方法和深度学习方法两类。...传统三维人体姿态估计和基于深度学习的姿态估计之间最明显的特征在于是否使用了多层神经网络的学习方法,因为建模方式不同,估计精确性、计算复杂度等方面也有着较大的差别。...解决实际问题由于实验个体所处环境的复杂性,很大程度上增加了模型的建立难度,因此选取适当且有效的图像特征来简化模型建立过程十分重要。...'gray') 2.2 unity3D程序设计 Unity3D这里主要使用到了三维场景搭建和CS脚本制定逻辑,这里场景搭建,搭建好模型后手动规划即可。

    1K10

    可视化理解四元,愿你不再掉头发

    本文阅读时间约8分钟 四元的可视化 四元被广泛应用在计算机图形学领域,游戏引擎Unity也是用四元在后端计算旋转。...而旋转的其他表示方法各有优劣: 旋转矩阵:用九个数来表示三个自由度,矩阵的每一列表示旋转后的单位向量方向,缺点是有冗余性,紧凑[1]。...单位超球面在三维空间的投影 如同复数的定义,四元由一个实数项和三个虚数项构成。对 q2 左乘一个四元 q1,其作用是将 q2 拉伸 q1 的模长,再作用一个特殊的四维旋转。...首先,如果待旋转的向量 p 与单位四元虚部所表示的旋转轴正交,我们只需要左乘单位四元就可以表示此旋转。如下图所示,i 点绕 k 轴进行旋转,左乘单位四元 q 即可。 ?...我们观察了乘法法则在三维投影的规律,并简单解释了四元为什么要用 qpq‘ 的形式来表示三维旋转

    4.7K30

    Unity3D】Unity使用 C# 调用 Java ③ ( C# 调用 Java 实例 | 进行 Android 工程打包 | Android Studio 运行 Android 工程 )

    Unity 项目导出为了 Android 项目 , 并在 Android Studio 编译并运行了该项目 ; 使用的 C# 脚本 , 是Unity3D】Unity 游戏画面帧更新 ( 游戏物体...GameObject 移动 | 借助 Time.deltaTime 进行匀速运动 ) 系列博客编写的脚本 ; 博客 【Unity3D】Unity使用 C# 调用 Java ① ( Android...Unity 编辑器 ; 博客 【Unity3D】Unity使用 C# 调用 Java ② ( C# 调用 Java 的相关方法介绍 | 调用 Java 方法 | 获取 Java 字段 | 设置...// 速度设置为 1 单位 / 秒 float speed = 1f; // 计算长度 , 速度 乘以 距离上次帧更新的时间差 float...运行 Android 工程 ---- 使用 Android Studio 打开该 Unity_Project_2 项目 ; 华为 手机 , 运行 Unity 导出的 Android Studio

    1.6K20

    《Motion Design for iOS》(二十四)

    这里就是使用JNWSpringAnimation来使用弹簧动作旋转一个layer的示例。...这个函数是一个改变视图的变化矩阵的平移组件的简单方式,接收两个参数,x和y的变化。 当然,我们可以一次性动画很多属性。这里是一个同时动画比例和旋转的代码。看你能不能发现与单个属性动画的区别。...与之前的例子的代码相比第一个不同是当我们添加动画后设置模型层的实际变化值(所以才能保持最终值。)...通过引入当前的变形值,我们可以确保对我们的操作使用最近的值,而这就会包含第二个动画的最终值。 第二个动画会旋转我们的对象π的角度。让我们看看包含比例和旋转变形的动画看起来什么样。...这里是一个比例和旋转动画的例子,其比例弹簧使用了一个指数衰减类型的弹簧动作(没有弹性),而旋转动画动作非常有弹性。 这里是另一个同时添加两个动画的例子。

    29520

    使用Bezier曲线移动

    1962年,法国数学家Pierre Bézier第一个研究了这种矢量绘制曲线的方法,并给出了详细的计算公式,因此按照这样的公式绘制出来的曲线就用他的姓氏来命名,称为贝塞尔曲线。...以下公式:B(t)为t时间下 点的坐标; P0为起点,Pn为终点,Pi为控制点 一阶贝塞尔曲线(线段): 意义:由 P0 至 P1 的连续点, 描述的一条线段 二阶贝塞尔曲线(抛物线): 原理:由 P0...至 P1 的连续点 Q0,描述一条线段。...由 P1 至 P2 的连续点 Q1,描述一条线段。 由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。 经验:P1-P0为曲线P0处的切线。...p2 = Plot(time+0.001f); transform.position = p1; transform.rotation = Quaternion.LookRotation

    7510

    Unity2D游戏开发-坐标系与辅助线绘制

    使用游戏对象自身的transform组件定义的Orientation(方向)。 本地坐标系是相对于父对象坐标系的,如果没有父对象,则相对于世界坐标系。 当对象位置或旋转,本地坐标系也会跟着改变。...总之,Unity的本地坐标系是相对游戏对象自身的坐标系统,用于表示对象内部的相对关系,是一个非常重要的概念 屏幕坐标系 屏幕坐标就是相对于游戏的屏幕来说的,最大和游戏分辨率相等。...GUI、Gizmos 和 Handles Unity 的主要使用场景如下: GUI - 用于游戏界面创建UI元素,如按钮、文本等。...,如移动、旋转控制器。...用于游戏运行时界面 Gizmos用于场景编辑的可视化信息 Handles用于场景编辑的交互控制 明确三者的适用场景,可以更好地Unity使用它们实现各自的功能。

    82010
    领券