【转】Unity四元数和向量相乘作用及其运算规则

作用:四元数和向量相乘表示这个向量按照这个四元数进行旋转之后得到的新的向量。

比如:向量vector3(0,0,10),绕着Y轴旋转90度,得到新的向量是vector3(10,0,0)。

在unity中表示为:

运行结果为:

复合旋转就是四元数依次相乘,最后乘以向量

多来几例:

想了解其中的运算过程的可以往下看。

将四元数的四个值分别计为:(w,x,y,z),unity中的四元数中的四个数字是(x,y,z,w),不影响下面的计算过程。

绕任意轴旋转任意角度的四元数为:

那么绕着Y轴旋转90度的四元数就是q = (√2/2 , 0 , √2/2 , 0);

(unity中这个Quaternion.Euler(0,90,0)打debug的话是(0,√2/2 , 0 , √2/2 ),因为排列顺序是(x,y,z,w),不影响下面的计算过程)

四元数乘以向量的运算规则为:q * v = (q) *( v) *( q−1);

其中:

q = (√2/2 , 0 , √2/2 , 0);

v,将v向量扩充为四元数(0,v),也就是v = (0 , 0,0 , 10);

q−1是四元数q的逆,求逆过程如下:

共轭四元数:q*=(w,-x,-y,-z),也就是(√2/2 , 0 , -√2/2 , 0)
四元数的模:N(q) = √(x^2 + y^2 + z^2 +w^2),即四元数到原点的距离,计算结果为1
四元数的逆:q−1=q*/N(q),也就是q−1 = (√2/2 , 0 , -√2/2 , 0)
q * v = q * v * q−1 = (√2/2 , 0 , √2/2 , 0) * (0 , 0,0 , 10)*(√2/2 , 0 , -√2/2 , 0);

四元数乘法公式:

按照上述计算公式: q * v = q * v * q−1

(√2/2 , 0 , √2/2 , 0) * (0 , 0,0 , 10) = (0,5√2,0,5√2)

(0,5√2,0,5√2) * (√2/2 , 0 , -√2/2 , 0)=(0,10,0,0);

将最后得到的四元数(0,10,0,0)变为向量(0,newV),就是newV(10,0,0)。

---------------------
作者:capricorn1245
来源:CSDN
原文:https://blog.csdn.net/capricorn1245/article/details/82724830
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/jeason1997/p/9822353.html

时间: 2024-11-03 18:12:41

【转】Unity四元数和向量相乘作用及其运算规则的相关文章

Unity四元数和旋转

四元数介绍 旋转,应该是三种坐标变换--缩放.旋转和平移,中最复杂的一种了.大家应该都听过,有一种旋转的表示方法叫四元数.按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法--矩阵旋转和欧拉旋转.矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按照一定的坐标轴顺序(例如先x.再y.最后z).每个轴旋转一定角度来变换坐标或向量,它实际上是一系列坐标轴旋转的组合. 那么,四元数又是什么呢?简单来说,四元数本质上是一种高阶复数(听不懂了吧...),是一个四维空间,相对

unity四元数

若想要某个物体(i,j,k)绕着a(x,y,z)轴旋转θ度.这个旋转用四元数表示就是q = ((x,y,z)sinθ/2, cosθ/2) 该物体用四元数表示为p = ((j,j,k),0).那么旋转之后的物体的点为p′,则: 通过某个公式能算出p′的值. Quaternion.AngleAxis (30.0f, transform.right) 这个方法的意思是创建一个四元数表示饶transform.right轴旋转30度.四元数可以用*操作符来进行多个旋转操作比如: transform.ro

unity 四元数, 两行等价的代码

Vector3 tmpvc; 1. tmpvc = Quaternion.Euler (new Vector3 (0, 30, 0)) * new Vector3 (0, 0, 1); 2. tmpvc = new Vector3 (sin (30.0f), 0, cos (30.0f)); transform.position = target.transform.position + tmpvc.normalized * 5; 第二个tmpvc 不用normalized float sin 

【几何系列】四元数的基础

William Rowan Hamilton 在 1843 年发明了四元数(quaternions).他努力推广四元数来描述三维空间,不过当时有很多数学家反对,认为四元数很邪恶. 不过在一个世纪之后,四元数在计算机工业界起死回生,包括计算机图形学.机器人等领域应用广泛.他描述三维旋转简洁.计算高效.也能避免数值误差. 除此之外,四元数在量子力学方面也有应用. 定义 四元数的定义和相关规则如下: $$q=a+bi+cj+dk$$ 其中 $a$.$b$.$c$.$d$ 是标量,而 $i$.$j$.$

Unity常见面试题大全

1.       [C#语言基础]请简述拆箱和装箱. 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程. 1.在堆中开辟内存空间. 2.将值类型的数据复制到堆中. 3.返回堆中新分配对象的地址. 拆箱操作: object类型显示转换为值类型或从接口类型到实现该接口值类型的过程. 1.判断给定类型是否是装箱时的类型. 2.返回已装箱实例中属于原值类型字段的地址. 2.        [.NET(C#)] attribute,property,markup,ta

Unity面试题整理

Unity技术面试题 一:什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行.换句话说,开启协程就是开启一个可以与程序并行的逻辑.可以用来控制运动.序列以及对象的行为. 二:Unity3d中的碰撞器和触发器的区别?答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性.当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数:当Is Trigger=true时,碰撞器被物理引

Unity全面的面试题(包含答案)

这个是我刚刚整理出的Unity面试题,为了帮助大家面试,同时帮助大家更好地复习Unity知识点,如果大家发现有什么错误,(包括错别字和知识点),或者发现哪里描述的不清晰,请在下面留言,我会重新更新,希望大家共同来帮助开发者 一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足. 二:Unity3d中的碰撞器和触发器的区别? 碰撞器是触发器的载体,而触发器只是碰撞器身上的一个

unity 面试题(答案)

一.什么是渲染管道?是指在显示器上为了显示出图像而经过的一系列必要操作.渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去.主要步骤有:本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化. 二.如何优化内存?有很多种方式,例如1.压缩自带类库:2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉:3.释放AssetBundle占用的资源:4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小:

Unity Shader-渲染队列,ZTest,ZWrite,Early-Z

原文地址:Unity Shader-渲染队列,ZTest,ZWrite,Early-Z 简介 在渲染阶段,引擎所做的工作是把所有场景中的对象按照一定的策略(顺序)进行渲染.最早的是画家算法,顾名思义,就是像画家画画一样,先画后面的物体,如果前面还有物体,那么就用前面的物体把物体覆盖掉,不过这种方式由于排序是针对物体来排序的,而物体之间也可能有重叠,所以效果并不好.所以目前更加常用的方式是z-buffer算法,类似颜色缓冲区缓冲颜色,z-buffer中存储的是当前的深度信息,对于每个像素存储一个深