首页 > 其他分享 >unity3d————四元数概念

unity3d————四元数概念

时间:2024-11-06 21:46:12浏览次数:3  
标签:unity3d GameObject transform 旋转 四元 概念 Quaternion rotation

一、定义与表示

四元数是由一个实数部分和三个虚数部分组成,通常表示为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)允许你平滑地在两个旋转之间过渡。

 

标签:unity3d,GameObject,transform,旋转,四元,概念,Quaternion,rotation
From: https://blog.csdn.net/2401_82978699/article/details/143568113

相关文章

  • IOS获取“酷狗概念版”app的URL scheme
    1,在苹果应用商店安装debuganywhere2,打开“酷狗概念版”app3,随便点一首歌,点击分享按钮 4,点击复制链接 5,打开安装好的debuganywhere,将复制的链接粘贴到输入框,点击debug 6,点击齿轮按钮 7,切换到Source栏,就可以找到相关URLscheme 8,复制scheme|URLIOS的值,打开快捷......
  • java中几个易混淆概念的区分
    java中几个易混淆概念的区分接口和抽象类相同点都可以有抽象方法都不能直接实例化相同点一个类可以实现多个接口,但是只能继承一个类抽象类的成员变量可以是各种类型的,接口的成员变量只能是publicstaticfinal类型的抽象类中可以有静态代码块,接口里面不能含有静态代码......
  • 【C/C++】野指针概念以及避免方式
    C语言中的野指针详解野指针(WildPointer)是指向未定义或非法内存位置的指针。本博客讲解野指针的概念、产生原因、危害以及如何避免野指针的问题。1.什么是野指针野指针指的是未初始化或已经失效的指针变量。这些指针指向的内存位置不再有效,可能被系统回收或被其他变量使......
  • 【docker】6. 镜像仓库/镜像概念
    DockerRegistry(镜像仓库)什么是DockerRegistry镜像仓库(DockerRegistry)负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。镜像仓库管理多个Repository,Repository通过命名来区分。每个Repository包含一个或多个镜像,镜像通过镜像名称和标签(T......
  • unity3d————叉乘的知识点
    一、向量叉乘的知识点定义与公式:向量叉乘的定义为:对于两个三维向量a和b,它们的叉乘结果是一个向量c,记为c=a×b。叉乘的计算公式为:c=(y1z2-y2z1)i+(x2z1-x1z2)j+(x1y2-x2y1)k,其中a=(x1,y1,z1),b=(x2,y2,z2),i、j、k分别为x、y、z轴的单位向量。几何意义:叉乘得到的向量c与......
  • action概念
    ......
  • mutation概念
    ......
  • CSS基础概念:什么是 CSS ? CSS 的组成
    什么是CSS?CSS(层叠样式表,CascadingStyleSheets)是一种用于控制网页外观的样式表语言。通过定义样式规则,CSS可以指定HTML页面中各个元素的显示方式,包括颜色、布局、字体、间距等。与HTML专注于内容结构不同,CSS的主要作用是美化和布局HTML页面,使网页在视觉上更具......
  • Kafka笔记系列-概念相关
    消息队列的主要功能连接服务、消息路由、消息传递、数据持久化、日志记录消息队列基本分类1、点对点生产者发送消息到队列中,消费者从队列中取出并消费。消息在消费以后,队列中不再有存储,队列可以有多个消费者,但是一个消息只能被一个消费者消费2、发布订阅模式生产者发布消息......
  • 操作系统的概念与功能
    操作系统的概念与功能‍​​‍操作系统的定义操作系统(OperatingSystem,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。‍操作系统的功能和目标......