Unity中使用四元数乘法表示旋转

四元数乘法旋转的本质是旋转的连续应用。
当你执行p * q时,可以理解为首先应用四元数p的旋转,然后再应用四元数q的旋转。

四元数旋转乘法主要分为全局坐标的旋转和局部坐标的旋转.

全局坐标下的旋转:

transform.rotation=transform.roation*quaterion可以解析如下:
 transform.rotation表示应用自身的旋转(也可以理解为将物体从默认旋转应用到transform.rotation),然后应用Quaternion旋转(也可以说是向自己施加quaterion旋转,一个意思),因此结果就是绕本地轴旋转了quaternion.

而transform.rotation=Quaternion*transform.rotation;
可以理解为对空间应用Quaternion旋转,对空间进行旋转也就是对空间坐标系的基进行旋转。也就是将整个空间朝某个方向旋转,然后在旋转后的空间中再应用transform.rotaion,因此就是绕世界轴进行了旋转。

局部坐标下的旋转:


物体的localRotation其实就等于先应用父物体旋转,再应用本地旋转,也就是:transform.localRotation = transform.parent.rotation * transform.localRotation。但是我这里不打算通过这个来推断之后的局部旋转和全局旋转的异同关系。因为局部旋转的计算本质上依然是旋转的连续应用。
局部坐标时,localRotation=loaclRotation*q和世界坐标的原理一样,也是先应用自身旋转然后应用q的旋转。结果便是绕自身坐标系旋转。

而使用transform.localRotation=q*transform.localRotation也和之前一样。还是先对坐标系进行旋转,只不过这里旋转的是局部坐标系,然后再应用自身旋转,也就是自身绕着局部坐标系中的q进行了旋转。和世界坐标中的旋转原理一样,但是坐标系不同,结果自然不同。

示例:

假设我们想要按下x键时,物体绕y轴持续旋转:

using UnityEngine;public class RotateOnKeyPress : MonoBehaviour
{public float rotationSpeed = 90.0f; // 每秒旋转的度数void Update(){// 检查是否按下了X键if (Input.GetKey(KeyCode.X)){// 计算每帧的旋转量float rotationThisFrame = rotationSpeed * Time.deltaTime;// 创建一个代表顺时针旋转的四元数Quaternion rotation = Quaternion.Euler(0, rotationThisFrame, 0);// 将四元数乘法应用于当前旋转transform.rotation = transform.rotation * rotation;}}
}

世界旋转转换为局部旋转

某些时候我们需要将世界旋转转换为局部旋转,比如制作布娃娃的关节朝向时,我们需要将世界朝向转换为关节的局部朝向并设置给关节的targetRotation。而之所以要转为局部的旋转是因为关节的targetRotation就是使用关节自己的坐标系进行控制的

为了简化,我们不使用布娃娃,而是使用一个简单的例子。例子中我们需要让自己指向worldRotation,代码为:

Quaternion worldRotation = ...; // 你的世界旋转四元数
Transform parentTransform = myObject.transform.parent; // 获取父对象的Transform// 如果物体有父对象,则考虑父对象的旋转
if (parentTransform != null)
{Quaternion parentRotation = parentTransform.rotation; // 父对象的世界旋转Quaternion localRotation = Quaternion.Inverse(parentRotation) * worldRotation; // 转换为局部旋转myObject.transform.localRotation = localRotation; // 应用局部旋转
}
else
{// 如果没有父对象,世界旋转即是局部旋转myObject.transform.localRotation = worldRotation;
}

其中的关键代码为:

Quaternion parentRotation = parentTransform.rotation; // 父对象的世界旋转
Quaternion localRotation = Quaternion.Inverse(parentRotation) * worldRotation; // 转换为局部旋转

首先我们获取parentRotaion,然后我们要指向的局部旋转就是Quaternion.Inverse(parentRotation) * worldRotation;

可能有些人一头雾水,但是结合我上面所说的四元数乘法的本质,连续的应用旋转。

我们可以看到,先应用parentRotation旋转的逆。然后再应用wolrdRotaion。

注意,应用这两个字。

Quaternion.Inverse表示旋转的逆,看作名词的话,就是父物体旋转的反方向的旋转,而在我们这里我们可以把它看作动词,就是逆向旋转,把父物体进行逆向旋转。

所以应用inverse,就是把父物体旋转回初始方向,也就相当于没有旋转,此时,本地坐标系的朝向就等于世界坐标系的朝向,所以我们只需要再应用目标朝向就可以旋转到目标方向了。

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

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

相关文章

考研复试英语口语问答举例第一弹

考研复试英语口语问答举例第一弹 文章目录 考研复试英语口语问答举例第一弹Question :介绍你的读研兴趣与动机Answer1:(医疗与人工智能结合方向)Answer2:(分布式与网安方向)Answer3:…

AUTOSAR规范与ECU软件开发(基础篇)1.2 汽车电子控制系统的基本构成

目录 前言 1、 传感器 2、 电子控制单元(ECU) 3、 执行器 前言 汽车电子控制系统主要由传感器(Sensor) 、 电子控制单元(Electronic Control Unit, ECU) 和执行器(Actuator) 组成(图1.1) ,对被控对象(Controlled Object) 进行控制。

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3,

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。 Python 实现斐波那契数列代码如下: 实例(Python 3.0) # -*- coding: UTF-8 -*- # File…

JS和TS的基础语法学习以及babel的基本使用

简介 本文主要介绍了一下js和ts的基础语法,为前端开发zuo JavaScript 更详细的 JavaScript 学习资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 简介 定位 : JavaScript 是一种动态语言,它包含类型、运算符、标准内置( bu…

数字IC设计——数字电路基本元器件

现代数字集成电路基本由CMOS晶体管构成,而CMOS门电路由PMOS场效应管和NMOS场效应管以对称互补的形式组成,所谓“互补”,即利用互补型MOSFET,即pMOS和nMOS,二者成对出现构成互补电路。 这种电路具有高的电路可靠性和抗干…

Mysql show Profiles详解

1.简介 show profile 和 show profiles 命令用于展示SQL语句的资源使用情况,包括CPU的使用,CPU上下文切换,IO等待,内存使用等,这个命令对于分析某个SQL的性能瓶颈非常有帮助,借助于show profile的输出信息&…

力扣hot100 二叉树的直径

👨‍🏫 题目地址 一个节点的最大直径 它左树的深度 它右树的深度 😋 AC code /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* Tr…

(基础篇)go常用使用场景三(死锁的场景及处理)

目录 一、通道的发送和接收不匹配 二、没有足够的机会让 goroutine 执行完成 三、资源竞争

[Android]RadioButton控件

RadioButton控件 RadioButton控件是单选按钮控件,它继承自Button控件,可以直接使用Button控件支持的各种属性和方法。 与普通按钮不同的是,RadioButton控件多了一个可以选中的功能,能额外指定一个android:checked属性…

手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯

目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 (一)HTML5及其优点 (二)HTML5在手机上实现视频应用功能的优势 四、手机HTML5…

Micropython的包管理

MicroPython包支持多种管理和安装方式,本文主要mip、mpremote以及手动安装包的方式,另外也会说明下如何发布自己的包。 使用**mip**安装包 mip(“mip installs packages”)是一个跟Python pip概念类似的工具,但它不使…

【数据结构】循环队列(数组实现)

目录 一、循环队列定义 怎么使一个数组在逻辑上呈“环状”呢? 二、循环队列与顺序队列的差异 1、存储方式: 2、操作方式: 3、空间利用率: 4、循环队列判断队空的方式: 5、循环队列判断队满的方式 完整测试代码及注释: 总…

axure RP9.0安装字体图标库fontawesome

字体图库地址: Font AwesomeThe internets icon library toolkit. Used by millions of designers, devs, & content creators. Open-source. Always free. Always awesome.https://fontawesome.com/v6/download进入后下载想要的版本如我是6.3 下载后得到压缩包,解压之后…

机器学习笔记 - 从2D数据合成3D数据

一、3D 数据简介 人们一致认为,从单一角度合成 3D 数据是人类视觉的一项基本功能,这对计算机视觉算法来说极具挑战性。但随着 LiDAR、RGB-D 相机(RealSense、Kinect)和 3D 扫描仪等 3D 传感器的可用性和价格的提高,3D 采集技术的最新进展取得了巨大飞跃。 与广泛使用的 2D…

数据库中的MVCC--多版本并发控制

一、前言 1、定义:MVCC(Multi-Version Concurrency Control),多版本并发控制,主要为了提高数据库 的并发性能。是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式。用于实现提交读和可重 复读这两种隔离级别。 2…

【重点】【单调栈】【循环数组】503.下一个更大元素 II

题目 法1&#xff1a;单调栈循环数组 class Solution {public int[] nextGreaterElements(int[] nums) {int n nums.length;int[] res new int[n];Stack<Integer> stack new Stack<>();for (int i 2 * n - 1; i > 0; --i) { // 循环数组处理!!!while (!st…

Mybatis-Plus乐观锁配置使用流程【OptimisticLockerInnerInterceptor】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家:人工智能学习网站 1.乐观锁实现 1.配置插件 1.XML方式 <bean class"com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerI…

C# .Net 开发设计多用户网上商城源码_OctShop

随着C#在TIOBE编程语言排行不断上升&#xff0c;这也标志着越来越多的程序员开始使用C#来开发项目了。在TIOBE2023年10月公布的排行中&#xff0c;C#和Java之间的差距越来越小了&#xff0c;仅为1.2%&#xff0c;随着C# .NetCore的免费开源&#xff0c;这一上升的趋势越来越明显…

MySQL视图特性

目录 视图概念基本使用创建视图修改视图会影响基表修改基表会影响视图删除视图 视图规则和限制 视图概念 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变…

[设计模式 Go实现] 行为型~中介者模式

中介者模式 中介者模式封装对象之间互交&#xff0c;使依赖变的简单&#xff0c;并且使复杂互交简单化&#xff0c;封装在中介者中。 例子中的中介者使用单例模式生成中介者。 中介者的change使用switch判断类型。 mediator.go package mediatorimport ("fmt"&q…