U2L5-4——四元数计算
U2L5-4——四元数计算
四元数相乘
角度的叠加
两个四元数相乘得到一个新的四元数,代表两个旋转量的叠加,相当于旋转
注意:旋转相对的坐标系 是物体自身坐标系
12Quaternion q = Quaternion.AngleAxis(20, Vector3.up);this.transform.rotation *= q; //相当于以自身坐标系绕y轴旋转20度
以后的旋转都由四元数相乘来完成!!!不再使用欧拉角!!!
四元数乘向量
向量的旋转
v2=q1∗v1v2 = q1 * v1v2=q1∗v1
四元数乘向量返回一个新向量,可以将指定向量旋转对应四元数的旋转量,相当于旋转向量
注意!“ * ”的左边一定是四元数,右边一定是向量,顺序不能颠倒也不能用“*=”
123456789Vector3 v = Vector3.forward;print(v);//v *= Quaternion.AngleAxis(45, Vector3.up);//v = v * Quaternion.AngleAxis(45, Vector3.up);//注意!!!以上两种写法都是错误的!只能写成 ...
U2L5-3——四元数常用方法
U2L5-3——四元数常用方法
本章代码关键字
12345Quaternion.identity //单位四元数,可以用于初始化方向Quaternion.LookRotation() //将一个Vector向量,转换为四元数,可以用于改变面朝向Quaternion.Lerp() //线性插值Quaternion.Slerp() //球形插值,在角度旋转方面建议用球形插值Quaternion.LookRotation() //用于让对象朝向传入的向量的方向的方法
单位四元数
用于对象角度初始化
单位四元数表示没有旋转量时(角位移)
当角度为0或者360度时
对于给定轴都会得到单位四元数
[1,(0,0,0)][1,(0,0,0)][1,(0,0,0)] 和 [−1,(0,0,0)][-1,(0,0,0)][−1,(0,0,0)] 都是四元数,表示没有旋转量
1234print(Quaternion.identity);testObj.rotation = Quaternion.identity;//单位四元数可以用于初始化方向Inst ...
U2L5-2——四元数的概念
U2L5-2——四元数的概念
四元数是简单的超复数,由实数加上三个虚数单位组成,主要用于在三维空间中表示旋转
四元数原理包含大量数学相关知识,较为复杂
比如:复数、四维空间等等
因此此处我们只对其基本构成和基本公式进行讲解
必备知识点:四元数相乘代表旋转四元数
本章代码关键字
1234new Quaternion(,,,) //按照四元数Q = [cos(β/2), sin(β/2)x, sin(β/2)y, sin(β/2)z]格式填入,构造绕n轴(三维向量)旋转β度的四元数Quaternion.AngleAxis(,) //以轴角对初始化四元数的方法,更简单更好Quaternion.Euler(,,) //欧拉角转四元数quaternion.eulerAngles //四元数转欧拉角
四元数的构成
一个四元数包含一个标量和一个3D向量
[w,v][w,v][w,v], www为标量,vvv为3D向量:[w,(x,y,z)][w, (x,y,z)][w,(x,y,z)]
对于给定的任意一个四元数: 表示3D空间中的一个旋转量
注意:我们一般不会直接通过四元数的 ...
U2L5-1——为什么使用四元数
U2L5-1——为什么使用四元数
原先的学习中,用来描述角度的是欧拉角(Transform的角度与旋转),但是接下来将使用四元数,这里通过介绍欧拉角的缺陷来解释为什么用四元数
欧拉角
由三个角度(x,y,z)组成,在特定坐标系下用于描述物体的旋转量
空间中的任意旋转都可以分解成:绕三个互相垂直轴的三个旋转角组成的序列
heading-pitch-bank是一种最常用的旋转序列约定,Y-X-Z约定,也就是先绕Y轴旋转,再绕X轴旋转,最后绕Z轴旋转
heading:物体绕自身的对象坐标系的Y轴,旋转的角度
pitch:物体绕自身的对象坐标系的X轴,旋转的角度
bank:物体绕自身的对象坐标系的Z轴,旋转的角度
Inspector窗口中调节的Rotation就是欧拉角,transform.eulerAngles 得到的就是欧拉角角度
欧拉角描述旋转的优点:直观,易于理解,存储空间小(只用三个数描述旋转),可以进行从一个方向到另一个方向旋转大于180的角度
欧拉角的缺陷
一是:同一旋转的表示角度不唯一(90度和450度)
二是:万向节死锁
当一次旋转出现两个轴重合时,某个方向的旋转不能直 ...
U2L5——四元数
U2L5——四元数
四元数
四元数,是简单的超复数。 复数是由实数加上虚数单位 i 组成,其中i²= -1。 相似地,四元数都是由实数加上三个虚数单位 i、j和k 组成,而且它们有如下的关系: i² = j² = k² = -1, iº = jº = kº = 1 , 每个四元数都是 1、i、j 和 k 的线性组合,即是四元数一般可表示为a + bi+ cj + dk,其中a、b、c 、d是实数。
对于i、j和k本身的几何意义可以理解为一种旋转,其中i旋转代表Z轴与Y轴相交平面中Z轴正向向Y轴正向的旋转,j旋转代表X轴与Z轴相交平面中X轴正向向Z轴正向的旋转,k旋转代表Y轴与X轴相交平面中Y轴正向向X轴正向的旋转,-i、-j、-k分别代表i、j、k旋转的反向旋转。
四元数_百度百科 (baidu.com)
四元数并不是生来为了解决三维旋转,但是它的性质非常有利于表达旋转信息。
为什么使用四元数?
因为欧拉角表示旋转本身存在不能避免且致命的缺陷
详细笔记U2L5-1——为什么使用四元数
四元数的概念
四元数解决了欧拉角的两个缺陷
U2L5-2——四元数的概念
四元数的常用方法
U2L ...
U2L4-5——向量插值计算
U2L4-5——向量插值计算
向量插值计算
Vector3也有为向量插值计算的方法,(插值计算相关概念)
本章代码关键字
12Vector3.Lerp() //向量线性插值Vector3.Slerp() //向量球形插值
线性插值
一般用于跟随移动,摄像机跟随等
对两个点进行插值计算,t的取值范围是0~1
公式:result = start + (end - start) * t
1A.position = Vector3.Lerp(A.position, target.position, Time.deltaTime);
线性插值计算也有两种应用
先快后慢趋近
先快后慢 每帧改变start位置 位置无限接近但不会得到end位置
123//result = start + (end - start) * t//先快后慢 每帧改变start位置 位置无限接近但不会得到end位置A.position = Vector3.Lerp(A.position, target.position, Time.deltaTime);
匀速接近
匀速 每帧改变时间 当>=1时 得到结果
...
U2L4-4——向量叉乘
U2L4-4——向量叉乘
向量叉乘
向量×向量
向量A (Xa,Ya,Za)
向量B (Xb,Yb,Zb)
A x B = (X,Y,Z)
X = YaZb - ZaYb
Y = ZaXb - XaZb
Z = XaYb - YaXb
A x B 得到的向量同时垂直A和B
A x B 向量垂直于A和B
组成的平面 A x B = -(B x A)
向量叉乘的几何意义是:
假设向量 A和B 都在XZ平面上
向量A 叉乘 向量B
结果大于0 说明 B在A右侧
结果小于0 说明 B在A左侧这个左侧右侧的判定标准是以OA向量方向为准
向量叉乘对于我们的意义
得到一个平面的法向量
得到两个向量之间的左右位置关系
注意!叉乘左右两边向量如果互换位置结果会变为原来的负向量,因此切记要确定叉乘的左向量和右向量
本章代码关键字
1Vector3.Cross(, ) //计算两个向量叉乘的方法
叉乘计算
Vector3提供了叉乘的方法(向量叉乘)
1print(Vector3.Cross(A.position, B.position));
用向量叉乘判断目标在左侧还是右侧
12345 ...
U2L4-3——向量点乘
U2L4-3——向量点乘
向量点乘
向量点乘可以用来判断对象的方位,计算两个向量之间的夹角
点乘计算公式:
向量A:(Xa,Ya,Za)A:(X_a,Y_a,Z_a)A:(Xa,Ya,Za)
向量B:(Xb,Yb,Zb)B:(X_b,Y_b,Z_b)B:(Xb,Yb,Zb)
A⃗⋅B⃗=Xa×Xb+Ya×Yb+Za×Zb=∣A⃗∣∣B⃗∣cosθ\vec{A} \cdot \vec{B} = X_a \times X_b + Y_a \times Y_b + Z_a \times Z_b = |\vec{A}||\vec{B}|\cos\theta
A⋅B=Xa×Xb+Ya×Yb+Za×Zb=∣A∣∣B∣cosθ
向量 · 向量 = 标量
向量点乘的几何意义是:
一个向量到另一个向量的投影的长度
点乘结果 > 0 两个向量夹角为锐角
点乘结果 = 0 两个向量夹角为直角
点乘结果 < 0 两个向量夹角为钝角
我们可以用这个规律判断对方的大致方位
它与向量模长和单位向量知识延伸出:
如果向量和自己的点乘结果为1,则该向量为单位向量:A⋅A=x2 ...
U2L4-2——向量加减乘除
U2L4-2——向量加减乘除
Vector3的相互计算
Vector3基础里已经包含了Vector3基本计算
这里将详细讲解它们的几何意义
向量加法 —— 主要用于位置平移和向量计算
向量减法 —— 主要用于位置平移和向量计算
向量乘除法 —— 主要用于模长放大缩小
向量加法
向量A:(Xa,Ya,Za)
向量B:(Xb,Yb,Zb)
A + B = (Xa + Xb, Ya + Yb, Za + Zb)
1this.transform.position += new Vector3(1, 2, 3);
Vector3+Vector3的意义
位置+位置 几何意义:
两个位置相加没有任何意义
向量+向量 几何意义:
两个向量相加得到一个新向量
向量 + 向量 = 向量
口诀: 向量相加,首尾相连
位置+向量 几何意义:
位置加向量得到一个新位置
位置 + 向量 = 位置
向量 + 位置 = 位置
口诀: 位置和向量相加=平移位置
向量减法
向量A(Xa,Ya,Za)
向量B(Xb,Yb,Zb)
A - B = (Xa - Xb, Ya - Yb, Za - ...
U2L4-1——向量模长和单位向量
U2L4-1——向量模长和单位向量
向量模长和单位向量
得到了向量 就可以利用 Vector3 中提供的 成员属性 得到 模长 和 单位向量
模长:相当于可以得到 两点之间的距离
单位向量:主要是用来进行移动计算的,它不会影响我们想要的移动结果,一般是用来表示方向
本章代码关键字
12vector3.magnitude //获取向量的模长的属性,只想要长度,排除方向vector3.normalized //获取模长为一的单位向量的属性,只想要方向,排除长度
向量的模长
向量的长度(只想要长度,排除方向)
模长 相当于可以得到 两点之间的距离
Vector3中提供了获取向量模长的成员属性magnitude
12345print(AB.magnitude);Vector3 C = new Vector3(5, 6, 7);print(C.magnitude);print(Vector3.Distance(A, B));
单位向量
模长为一的单位向量(只想要方向,排除长度)
单位向量 主要是用来进行移动计算的 它不会影响我们想要的移动结果
单位向量=向 ...