Quaternion

article/2025/10/31 2:39:38

01:欧拉角
在这里插入图片描述

1.欧拉角Vector3(x,y,z)代表的是旋转物体(若是标准旋转那么是旋转坐标轴x,y,z,转换为旋转物体则旋转角度取反顺序不变),且是将物体从物体坐标系旋转到惯性坐标系(世界坐标系中为了渲染),故旋转顺序为 z, y, x也就是roll pitch yaw。

2.欧拉角有别名和万向锁问题,不要随便增长欧拉角的值,也不要单独改变欧拉角的一个旋转角度值,而是用一个Vector3全部一起改变。

3.欧拉角来自于Transform.eulerAngles, 渲染时候也会转换到Transform.rotation四元数然后到旋转矩阵来旋转物体。

4.欧拉角插值使用 float fAngles = Mathf.MoveTowardsAngle(oldAngles, target, m_rotSpeed * Time.deltaTime); m_transform.eulerAngles = new Vector3(0, fAngles, 0);

  1. Unity 3d中与欧拉角有关的API
    以下一共讲述了5个相关的API,前4个通过给transform组件的属性赋值实现旋转,最后1个直接使用transform组件的方法实现旋转。
    值得注意的是,前2个方法(包含local关键字)可以实现基于父节点坐标系的旋转。

1.transform.localRotation //transfrom组件属性
该属性表示了在父节点坐标系中的旋转情况。通常使用四元数来进行初始化。例如
xxx.transform.localrotation=Quaternion.Euler(0.0f,0.0f,0.0f);

2.transform.localEulerAngles //transform组件属性
该属性也表示了在父节点坐标系中的旋转情况,只是直接通过欧拉角来初始化。例如

xxx.transform.localEulerAngles = new Vector3 (0.0f,0.0f,0.0f);

3.transform.rotation //transform组件属性
该属性表示了在全局坐标系下的旋转情况。通常使用四元数来赋值。例如
xxx.transform.rotation=Quaternion.Euler(0.0f,0.0f,0.0f);

4.transfrom.eularAngles //transform组件属性
该属性也表示了在全局坐标系下的旋转情况,直接使用欧拉角来赋值。例如
xxx.transform.eulerAngles = new Vector3(0.0f,0.0f,0.0f);

5.transform.Rotate(Vector3 eularAngles Space relativeTo) //transform组件方法

欧拉角,Unity中没有专门的API,所以这里我们用transform和rigidbody相关的API进行讨论。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

02:四元数
内部由四个数字(在Unity中称为x,y,z和w)组成,然而这些数字不表示角度或轴,并且通常不需要直接访问它们。
Unity里面的Transform组件里的Rotation是四元数,但是他是以欧拉角(Vector3)的形式展现在我们面前,目的就是为了方便我们修改。因此,我们给Rotation直接赋值的时候,也只能用Quaternion赋值。意识到这点很重要。

 private Transform cubeTransform;void Awake(){cubeTransform = this.GetComponent<Transform>();}void Start(){//修改欧拉角的角度cubeTransform.eulerAngles=new Vector3(45,45,45);//获取欧拉角Debug.Log("欧拉角"+cubeTransform.eulerAngles);//获取四元数Debug.Log("四元数"+cubeTransform.rotation);//四元数转换为欧拉角Debug.Log("四元数转换为欧拉角"+cubeTransform.rotation.eulerAngles);Debug.Log("欧拉角转换为四元数" + Quaternion.Euler(cubeTransform.eulerAngles));//通过修改四元数来改变角度cubeTransform.rotation=Quaternion.Euler(new Vector3(40,40,40));}

在这里插入图片描述

四元数的常用API
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
LookRotation

声明形式:public static Quaternion LookRotation ( Vector3 forward, Vector3 upwards=Vector3.up )这个功能很实用,传入的两个参数分别代表前方盯着的方向以及自己的上方向。它可以让一个GameObject转动脑袋盯着另一个物体。如:
  public Transform target;void Update() {Vector3 relativePos = target.position - transform.position;Quaternion rotation = Quaternion.LookRotation(relativePos);transform.rotation = rotation;}

二、Angle

声明形式:public static float Angle ( Quaternion a, Quaternion b )这个就比较简单了,它可以计算两个旋转之间的夹角。与Vector3.Angle()作用是一样的。三、Euler声明形式:public static Quaternion Euler ( float x, float y, float z )或者:    public static Quaternion Euler ( Vector3 euler )这个函数可以将一个欧拉形式的旋转转换成四元数形式的旋转。传入的参数分别是欧拉轴上的转动角度。四、Slerp声明形式:public static Quaternion Slerp ( Quaternion from, Quaternion to, float t )基本意思就是线性地从一个角度旋转到另一个角度,其中,旋转匀速增加t。

附加内容:很多时候from 和to都不是固定的,而且上一个脚本也不能保证所有角度下的旋转速度一致。所以我写了这个脚本来保证可以应付大多数情况。

    Transform target;float rotateSpeed = 30.0f;Quaternion wantedRotation = Quaternion.FromToRotation(transform.position, target.position);float t = rotateSpeed/Quaternion.Angle(transform.rotation, wantedRotation)*Time.deltaTime;transform.rotation = Quaternion.Slerp(transform.rotation, target.rotation, t);这个脚本可以保证物体的旋转速度永远是rotateSpeed。如果自身坐标和目标之间的夹角是X度,我们想以s=30度每秒的速度旋转到目标的方向,则每秒旋转的角度的比例为s/X。 再乘以每次旋转的时间Time.deltaTime我们就得到了用来匀速旋转的t。五、FromToRotation声明形式:public static Quaternion FromToRotation ( Vector3 from, Vector3 to )它是得到从一个方向到另一个方向的旋转。就是转一个方向,就这么简单。六、identity这个不是一个函数,它是一个只读的变量。它代表世界坐标系或者父物体坐标系中的无旋转方位。

http://chatgpt.dhexx.cn/article/tf0P9Ndo.shtml

相关文章

Quaternion.Euler调整记录

Quaternion.Euler调整 1.运行unity 调整摄像头视角&#xff0c;找到需要的位置&#xff0c;记录下 摄像头的位置和旋转角度。 2.调整空物体的位置 使之位置与需要的位置一致 3.调整Quaternion.Euler 使Quaternion.Euler与旋转数值一致。

Quaternion(四元数)和旋转以及Yaw, pitch, roll 的含义

原文&#xff1a; http://www.linuxgraphics.cn/graphics/opengl_quaternion.html Quaternion(四元数)和旋转 本文介绍了四元数以及如何在OpenGL中使用四元数表示旋转。 Quaternion 的定义 四元数一般定义如下&#xff1a; qwxiyjzk其中 w,x,y,z是实数。同时&#xff0c;有…

Unity3d开发之对Quaternion的使用

上周找到了新公司。这周二来上班。可怕的是我刚去的第二天下午四点领导通知我做一个VRdemo&#xff0c;要求第二天交。我勒个擦。我现在对设备还没熟悉呢。连sdk都没下载而且距离上一次开发vr是在快两年之前了。属实让我措手不及。没错&#xff0c;按剧本走&#xff0c;加班到凌…

【Unity编程】四元数(Quaternion)与欧拉角

欧拉旋转、四元数、矩阵旋转之间的差异 除了欧拉旋转以外&#xff0c;还有两种表示旋转的方式&#xff1a;矩阵旋转和四元数旋转。接下来我们比较它们的优缺点。 欧拉角 优点&#xff1a;三个角度组成&#xff0c;直观&#xff0c;容易理解。优点&#xff1a;可以进行从一个方…

Quaternion类

Euler public static Quaternion Euler(float x, float y, float z); public static Quaternion Euler(Vector3 euler); 功能: 返回Quaternion对应的欧拉角 例子&#xff1a; public class ExampleClass : MonoBehaviour {public Quaternion rotation Quaternion.Euler(0, 30,…

Unity Quaternion

Quaternion 类的属性 eulerAngles 欧拉角 Quaternion 类的实例方法 1、SetFromToRotion 函数 2、SetLookRotation 函数 3、ToAngleAxis 函数 Quaternion 类的静态方法 1、Angle方法 2、Dot方法 3、Euler方法 4、FromToRotation方法 5、Inverse方法 6、Lerp方法 7…

【第018问 Unity中对Quaternion.AngleAxis的理解?】

一、背景 在游戏研发过程中&#xff0c;有时候会对一个物体经过多次围绕不同的轴进行不同角度的旋转&#xff0c;从而计算得到一个方向&#xff0c;以此来检测在该对应的方向上是否有对应的物体或别的对象&#xff0c;因此本节对Quaternion.AngleAxis进行简单的记录&#xff1…

Unity API详解——Quaternion类

Quaternion类又称四元数&#xff0c;由x、y、z和w这4个分量组成&#xff0c;属于struct类型。在Unity中&#xff0c;用Quaternion来存储和表示对象的旋转角度。Quaternion的变换比较复杂&#xff0c;对于GameObject一般的旋转及移动&#xff0c;可以用Transform中的相关方法实现…

Unity3D - 详解Quaternion类[转载]

一、简介 Quaternion又称四元数&#xff0c;由x,y,z和w这四个分量组成&#xff0c;是由爱尔兰数学家威廉卢云哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地角度而言&#xff0c;四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话&…

【Unity】Unity常用类:向量Vector3、四元数Quaternion

文章目录 Vector3构造函数静态变量变量运算符常用方法&#xff08;静态&#xff09;OrthoNormalize&#xff08;正交标准化&#xff09;Reflect&#xff08;反射&#xff09;Lerp&#xff08;线性插值&#xff09; Quaternion构造函数静态变量变量常用方法Eular&#xff08;欧拉…

unity学习笔记——Quaternion(四元数)

本篇文章转自https://www.cnblogs.com/driftingclouds/p/6626183.html Quaternion类 Quaternion&#xff08;四元数&#xff09;用于计算Unity旋转。它们计算紧凑高效&#xff0c;不受万向节锁的困扰&#xff0c;并且可以很方便快速地进行球面插值。 Unity内部使用四元数来表…

【Unity编程】Unity中关于四元数的API详解

Unity中关于四元数的API详解 Quaternion类 Quaternion&#xff08;四元数&#xff09;用于计算Unity旋转。它们计算紧凑高效&#xff0c;不受万向节锁的困扰&#xff0c;并且可以很方便快速地进行球面插值。 Unity内部使用四元数来表示所有的旋转。 Quaternion是基于复数&am…

四元数快速入门【Quaternion】

四元数&#xff08;Quaternion&#xff09;是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述&#xff0c;以帮助理解在空间导航等应用程序中对四元数的需求。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 …

四元数(Quaternion)食用指南

四元数&#xff08;Quaternion&#xff09;食用指南 “这简直就是黑魔法&#xff01;” 开发时&#xff0c;每次遇到旋转问题时总会心头一震&#xff0c;在欧拉角和四元数这两种处理方式的选择上犹豫不决&#xff0c;不知不觉就陷入了四元数的淤泥中…接下来&#xff0c;我决定…

Unity3D - 详解Quaternion类

一、简介 Quaternion又称四元数&#xff0c;由x,y,z和w这四个分量组成&#xff0c;是由爱尔兰数学家威廉卢云哈密顿在1843年发现的数学概念。四元数的乘法不符合交换律。从明确地角度而言&#xff0c;四元数是复数的不可交换延伸。如把四元数的集合考虑成多维实数空间的话&…

int 的最大值

int 的最大值 java int 类整数的最大值是 2 的 31 次方 - 1 2147483648 - 1 2147483647 可以用 Integer.MAX_VALUE 表示它&#xff0c;即 int value Integer.MAX_VALUE; Integer.MAX_VALUE 1 Integer.MIN_VALUE -2147483648 再大的数就要用 long &#xff08;最大值 …

Python获取int最大值和float最大值

计算机所能表示的最大值&#xff0c;根据你的计算机的位数决定。有机计算机是64位&#xff0c;有的是32位&#xff0c;因此具体情况各不相同。本人的电脑是64位的。 1.获得int型的最大值 import sys MAX_INTsys.maxsize print(MAX_INT)2.获得float型的最大值 ##灰常简单 max…

C语言数据类型 int、long int 最大值

一、注意&#xff1a;前提是32位计算机&#xff1a; unsigned int 0&#xff5e;4294967295 int -2147483648&#xff5e;2147483647 unsigned long 0&#xff5e;4294967295 long -2147483648&#xff5e;2147483647 long long的最大值&#xff1a;9223372036854775807 long …

C++-int最大值

uint范围 0-255 int范围 -128 - 127 -2147483647 原码1111 1111 1111 1111 1111 1111 1111 1111-2147483647-1-2147483648;由于cpu里面存的是补码计算-2147483647  补码1000 0000 0000 0000 0000 0000 0000 0001-1       补码1111 1111 1111 1111 1111 1111 1111 11…

c语言求int的最大值最小值,c语言 int最大值是多少?

喵喔喔 int最大值&#xff0c;根据编译器类型不同而变化&#xff0c;具体如下&#xff1a;1、对于16位编译器&#xff0c;int占16位(2字节)。int的最大值为32767.2、对于32位和64位编译器&#xff0c;int占32位(4字节)。int的最大值为21474836473、可以通过打印sizeof(int)查看…