Unity Quaternion

article/2025/10/31 2:41:59

Quaternion 类的属性

eulerAngles  欧拉角

Quaternion 类的实例方法

1、SetFromToRotion 函数

2、SetLookRotation 函数

3、ToAngleAxis 函数

Quaternion 类的静态方法

1、Angle方法

2、Dot方法

3、Euler方法

4、FromToRotation方法

5、Inverse方法

6、Lerp方法

7、LookRotation方法

8、RotateToWards方法

9、Slerp方法

Quaternion 类的实例方法

SetFromToRotion 函数

1、public void SetFromToRotion(Vector3 fromDirection, Vector3 toDirection);

可以创建一个从向量fromDirection到向量toDirection的旋转。(fromDirection 和 toDirection 不能为Vector3.zero)

代码示例: m_q.eulerAngles = (45.0, 0.0, 0.0)

        // 向量1Vector3 v1 = new Vector3(2, 3, 4);Debug.DrawRay(Vector3.zero, v1.normalized * 3, Color.red);// 向量2Vector3 v2 = new Vector3(2, -3, -1);Debug.DrawRay(Vector3.zero, v2.normalized * 3, Color.green);// 四元数q1: 向量v1到向量v2的旋转Quaternion q1 = Quaternion.identity;q1.SetFromToRotation(v1, v2);// 设置cube0的旋转为q1m_cube0.rotation = q1;// 得到旋转后cube0坐标系中的变量v1,在世界坐标系中的向量v3Vector3 v3 = m_cube0.TransformDirection(v1);Debug.DrawRay(Vector3.zero, v3.normalized * 2, Color.blue);

由运行结果可以看到v3和v2指向相同,cube0做了如下变换,首先将自身坐标系与世界坐标系一致,然后将自身坐标系中v1指向的方向旋转到v2指向方向。

SetLookRotation 函数

1、public void SetLookRotation(Vector3 v1);

设置Quaternion实例的朝向与向量v1指向的方向相同

2、public void SetLookRotation(Vector3 v1, Vector3 v2);

设置transform.forward(z轴) 方向与v1方向相同,transform.right (x轴)垂直于由 Vector3.zer0、v1和v2这3点构成的平面。v2决定了transform.up(y轴)的朝向,因为当transform.forward和transform.right方向确定后,transform.up的方向总会与V2的方向的夹角小于或等于90度。当V1为Vector3.zero时,方法失效。

代码示例

    void Update(){Vector3 v1 = new Vector3(-3, 3, 3);Vector3 v2 = new Vector3(3, 4, 1);m_q.SetLookRotation(v1, v2);Debug.DrawLine(Vector3.zero, v1, Color.red);Debug.DrawLine(Vector3.zero, v2, Color.green);Debug.Log("m_cube0.forward = " + Vector3.Normalize(m_cube0.forward));Debug.Log("v1 = " + Vector3.Normalize(v1));Debug.Log("angle from m_cube0.right to v1 = " + Vector3.Angle(m_cube0.right, v1));Debug.Log("angle from m_cube0.right to v2 = " + Vector3.Angle(m_cube0.right, v2));Debug.Log("angle from m_cube0.up to v2 = " + Vector3.Angle(m_cube0.up, v2));m_cube0.rotation = m_q;}

ToAngleAxis 函数

1、public void ToAngleAxis(out float angle,out Vector3 axis);

参数angle为旋转角,参数axis为轴向量。

该函数可以实现将GameObject对象的rotation从Quaternion.identity状态变换到当前状态,只需要将GameObject对象绕着axis轴(世界坐标系)旋转angle角度即可。

代码示例

    public Transform m_cube0;public Transform m_cube1;public Transform m_cube2;public Vector3 m_axis;public float m_angle;public Vector3 m_eulerAngles;void Update(){m_eulerAngles.x += Time.deltaTime * 2.0f;m_eulerAngles.y += Time.deltaTime * 1.0f;m_eulerAngles.z += Time.deltaTime * 3.0f;m_cube0.eulerAngles = m_eulerAngles;m_cube0.rotation.ToAngleAxis(out m_angle, out m_axis);m_cube1.rotation = Quaternion.AngleAxis(m_angle, m_axis);Debug.DrawRay(m_cube1.position, m_cube1.forward * 2, Color.blue);Debug.DrawRay(m_cube1.position, m_cube1.right * 2, Color.red);Debug.DrawRay(m_cube1.position, m_cube1.up * 2, Color.green);}

 

Quaternion 类的静态方法

Angle 函数

1、public static float Angle(Quaternion a,Quaternion b);

该方法可以计算两个旋转状态a达到b时需要旋转的最小夹角。

代码示例

    private void Update(){// 向量1Vector3 v1 = new Vector3(2, 3, 4);Quaternion q1 = Quaternion.identity;Quaternion q2 = Quaternion.identity;q1.SetLookRotation(v1);float a1, a2;Vector3 v = Vector3.zero;a1 = Quaternion.Angle(q1, q2);q1.ToAngleAxis(out a2, out v);Debug.Log("a1: " + a1);Debug.Log("a2: " + a2 + "  v: " + v);Debug.Log("q1.eulerAngles: " + q1.eulerAngles + " q1: " + q1);Debug.Log("q2.eulerAngles: " + q2.eulerAngles + " q2: " + q2);Debug.DrawRay(Vector3.zero, v1.normalized * 5, Color.red);Debug.DrawRay(Vector3.zero, v.normalized * 5, Color.green);}

 

Dot 函数

1、public static float Dot(Quaternion a, Quaternion b);

该方法可以根据点乘的结果,判断a和b对应欧拉角的关系。

例如有两个Quaternion实例q1(x1,y1,z1,w1)和q2(x2,y2,z2,w2),则float f = Quaternion.Dot(q1,q2);即f = x1*x2+y1*y2+z1*z2+w1*w2,结果值f的范围为[-1,1]。当f=+(-)1时,q1和q2对应的欧拉角是相等的,即旋转状态是一致的。特别地,当f = -1时,说明其中一个rotation比另外一个rotation多旋转了360°。

        // 四元数q1, 四元数q2, 四元数q3, 四元数q4Quaternion q1 = Quaternion.Euler(10, 10, 10);Quaternion q2 = Quaternion.Euler(370, 370, 370);Quaternion q3 = Quaternion.Euler(10, 10, 10);Quaternion q4 = Quaternion.Euler(20, 40, 70);Debug.Log("Quaternion.Dot(q1, q2) = " + Quaternion.Dot(q1, q2));Debug.Log("Quaternion.Dot(q1, q3) = " + Quaternion.Dot(q1, q3));Debug.Log("Quaternion.Dot(q1, q4) = " + Quaternion.Dot(q1, q4));

Euler方法

1、public static Quaternion Euler(Vector3 euler);

2、public static Quaternion Euler(float x,float y,float z);

该方法用于返回欧拉角Vector3(ex,ey,ez)对应的四元数Quaternion q(qx,qy,qz,qw)。其对应关系如下:已知PIover180 = 3.141592/180 = 0.0174532925f是计算机图形学中的一个常亮,其变换过程如下:

        float PIover180 = 0.0174532925f;float ex = 30, ey = 40, ez = 50;Quaternion q = Quaternion.Euler(ex, ey, ez);Debug.Log("q.x = " + q.x);Debug.Log("q.y = " + q.y);Debug.Log("q.z = " + q.z);Debug.Log("q.w = " + q.w);ex = ex * PIover180 / 2.0f;ey = ey * PIover180 / 2.0f;ez = ez * PIover180 / 2.0f;float qx = Mathf.Sin(ex) * Mathf.Cos(ey) * Mathf.Cos(ez) + Mathf.Cos(ex) * Mathf.Sin(ey) * Mathf.Sin(ez);float qy = Mathf.Cos(ex) * Mathf.Sin(ey) * Mathf.Cos(ez) - Mathf.Sin(ex) * Mathf.Cos(ey) * Mathf.Sin(ez);float qz = Mathf.Cos(ex) * Mathf.Cos(ey) * Mathf.Sin(ez) - Mathf.Sin(ex) * Mathf.Sin(ey) * Mathf.Cos(ez);float qw = Mathf.Cos(ex) * Mathf.Cos(ey) * Mathf.Cos(ez) + Mathf.Sin(ex) * Mathf.Sin(ey) * Mathf.Sin(ez);Debug.Log("qx = " + qx);Debug.Log("qy = " + qy);Debug.Log("qz = " + qz);Debug.Log("qw = " + qw);

FromToRotation方法

1、public static Quaternion FromToRotation(Vector3 fromDirection,Vector3 ToDirection);

可以创建一个从向量fromDirection到向量toDirection的旋转。(fromDirection 和 toDirection 不能为Vector3.zero)。同SetFromToRotation实例方法的功能一样。

LookRotation方法

1、public static Quaternion LookRotation(Vector3 forward); public static Quaternion

2、LookRotation(Vector3 forward,Vector3 upwards);

参数forward为返回Quaternion实例的forward朝向。该方法和前面讲到的SetLookRotation实例方法的功能是一样。

Inverse方法

1、public static Quaternion Inverse(Quaternion rotation);

该方法可以返回参数rotation的逆向Quaternion值。例如rotation(x,y,z,w),那么Quaternion.Inverse(rotation) = (-x,-y,-z,w)。假设rotation的欧拉角为(a,b,c),则transform.rotation = Quaternion.Inverse(rotation)相当于transform依次绕自身坐标系的z轴、x轴和y轴分别旋转-c°、-a°和-z°。由于是在局部坐标系内的变换,最后transform的欧拉角的各个分量值并不一定等于-a、-b或-c。

Lerp方法 和 Slerp方法

1、public static Quaternion Lerp(Quaternion form, Quaternion to,float t);

2、public static Quaternion Slerp(Quaternion form, Quaternion to,float t);

两种方法的作用都是返回从form到to的插值。当参数t<=0时返回值为from,当参数t>=1时返回值为to。其中Lerp是线性差值,而Slerp是球面插值。

        Quaternion q1 = Quaternion.LookRotation(new Vector3(0, 0, 1));Quaternion q2 = Quaternion.LookRotation(new Vector3(0, 0, -1));m_speed += Time.deltaTime * 0.1f;if (m_speed > 1){m_speed = 1;}m_cube0.rotation = Quaternion.Lerp(q1, q2, m_speed);    // 线性m_cube1.rotation = Quaternion.Slerp(q1, q2, m_speed);   // 球面

RotateToWards方法

1、public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta);

该方法也是一个插值方法,即从返回参数from到to的插值,且返回值的最大角度不超过maxDegreesDelta。maxDegreesDelta是角度值,不是插值系数,当maxDegreesDelta < 0时,将进行逆向插值即从to到from的方向进行插值计算。

        Quaternion q1 = Quaternion.LookRotation(new Vector3(0, 0, 1));Quaternion q2 = Quaternion.LookRotation(new Vector3(0, 0, -1));m_speed += Time.deltaTime;m_cube0.rotation = Quaternion.RotateTowards(q1, q2, m_speed);

 

Quaternion类运算符

Quaternion类涉及到两个Quaternion对象相乘和Quaternion对象与Vector3对象相乘,那么就必须重载"*"运算符。

1、public static Quaternion operator *(Quaternion lhs, Quaternion rhs);

2、public static Vector3 operator *(Quaternion rotation, Vector3 point);

 

两个Quaternion对象相乘

对于两个Quaternion对象相乘主要用于自身旋转变换,例如:

B.rotation *= A.rotation;

B会绕着B的局部坐标系的z、x、y轴按照先绕z轴再绕x轴最后绕y轴的旋转次序,分别旋转A.eulerAngles.z度、A.eulerAngles.x度、和A.eulerAngles.y度。由于是绕着局部坐标系进行旋转,所以当绕着其中一个轴进行旋转时,可能会影响其余两个坐标轴方向的欧拉角(除非其余两轴的欧拉角都为0才不会受到影响)。

        Quaternion q1 = Quaternion.Euler(10, 10, 10);Quaternion q2 = Quaternion.identity;q2 *= q1;Debug.Log(q2.eulerAngles);q2 *= q1;Debug.Log(q2.eulerAngles);
 

Quaternion对象与Vector3对象

对于Quaternion对象与Vector3对象相乘主要用于自身移动变换,例如

transform.position += tansform.rotation * A;

其中A为Vector3的对象。transform对应的对象会沿着自身坐标系中向量A的方向移动A的模长的距离。transform.rotation与A相乘可以确定移动的方向和距离。


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

相关文章

【第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)查看…

C语言|int型最大值和最小值

一.int型的最值 有符号 最小值&#xff1a;-2147483647-1最大值&#xff1a;2147483647 无符号 最大值&#xff1a;0xffffffff最小值&#xff1a;0 大家可以在整形类型的取值范围限制头文件中查看&#xff1a;limits.h 二.int型最小值的原因 当我们直接给int型变量赋-214748364…

软件测试管理神器之zentao(禅道)-BUG管理

软件测试管理神器之zentao(禅道)-BUG管理 禅道在遵循其管理方式基础上&#xff0c;结合国内研发现状&#xff0c;整合了bug管理&#xff0c;测试用例管理&#xff0c;发布管理&#xff0c;文档管理等功能&#xff0c;完整的覆盖了软件研发项目的整个生命周期。在禅道软件中&…

软件测试Bug

bug组成 缺陷编号-测试管理系统自动生成缺陷标题->用简短精确的话语来描述你的bug缺陷类型--代码错误(功能--预期结果--Bug/未做功能---bG)/设计缺陷(需求不全面,考虑的场景遗漏)/界面优化(U-—致,去检查ui)缺陷等级-->致命(系统瘫痪、环境出错、无法进入下一步测试)/严…

禅道—禅道Bug管理模块

禅道官网&#xff1a;https://www.zentao.net/ 简介&#xff1a; 开源免费的项目管理软件、集产品管理、项目管理、测试管理一体以及事物管理组织管理的功能 使用原因&#xff1a; 开源 方便跟踪管理Bug使用简单易学及多种管理于一身 1、Bug操作流程 2、Bug的几种解决方案 …

软件测试bug文章,软件测试技术之说一个让你印象最深的bug?

本篇文章主要讲述软件测试技术之说一个让你印象最深的bug?,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。 今天来聊一下测试面试必问题目:说一个让你印象最深的bug? 被问到这个问题,如果面试者之前没有总结和准备过,会一下子被问懵逼,瞬间紧张…

软件测试常见Bug清单

软件测试中&#xff0c;bug的类型有很多种&#xff0c;比如&#xff1a;代码错误、界面优化、设计缺陷、需求补充和用户体验等&#xff1b; 一般情况下&#xff0c;需求补充和设计缺陷比较好区分&#xff0c;但是代码错误、界面优化和用户体验区分不是很明显&#xff1b; 下面…