1、简述
此文目的总结三维几何学基础,可以依此提纲做发散,不局限为UE4,任何三维领域系统均可以使用学习
2、三维坐标系统
- 笛卡尔坐标系(直角坐标系)
- 左/右手坐标系
- 局部坐标系
- 世界坐标系(3D世界的基础坐标系)
- 视空间(观察空间和摄像机空间,将世界空间转换为摄像机视野前面的坐标)
- 裁剪空间与设备坐标(通过投影矩阵将物体从观察空间转换到裁剪空间,并转换到指定范围的设备坐标中,最终映射到屏幕空间,表现为近大远小)
3、向量和运算
向量:在三维空间作为物理角度的向量具有以下特点
-
向量就是具有大小和长度的量 -
向量就是空间空的箭头 -
向量可以随意平移
举例:力,force;速度,velocity。这些都是具有大小和方向的量,都可以看成是向量。具体向量加减乘除运算规则这里不做讲解。 可以查看UE4中的FVector描述
点积 :A向量在B向量的投影,与B向量的长度乘积 UE4中使用为 FVector::CrossProduct() 主要用来计算夹角,比如处理Lambert光照,光源方向与物体表面方向的夹角,判断目标是否在视野等
叉积:垂直于两个向量的向量,如果以AB向量为边构成一个平行四边形,那么这两个向量外积的模长与这个平行四边形的面积。 UE4中使用为 FVector::DotProduct(),
矩阵与线性运算:
-
线性变换是操作空间的一种手段,它能够保持网格线平行且等距,并保持原点不动; -
矩阵乘法可以视为一种基向量的线性组合 -
矩阵乘法为计算线性变换作用于特定向量提供了一种途径,以二维空间中的变换为例: 经过一定的线性变换,我们关注基坐标变换后的位置,将其新的位置坐标构成矩阵,特别地,矩阵的列向量为描述线性变换提供了可能。 -
矩阵可以理解为一种线性变换,这样将有助于矩阵乘法、行列式、基变换、特征值的理解。
4、三维坐标变化
UE4中,三维空间内的某个"朝向",其实有3种表达方式:方向向量、欧拉角、四元数。而且这几种表达方式,可以相互转换。
欧拉角:欧拉角使用最简单的x,y,z值来分别表示在x,y,z轴上的旋转角度,其取值为0-360(或者0-2pi),一般使用roll,pitch,yaw来表示这些分量的旋转值,欧拉角容易出现的问题是 1)不易在任意方向的旋转轴插值; 2)万向节死锁;3)旋转的次序无法确定。
万向节死锁:由于矩阵乘法的本质是将左侧矩阵表示的变换信息应用于右运算元(向量/矩阵),而多个线性变换间一般是不可交换的,即矩阵乘法不满足交换律。所以三次旋转的顺序非常重要,在Unity、UE4、3dsMax等软件中,以欧拉角形式调整旋转时一般会将旋转顺序固定,而这正是导致万向锁(Gimbol Lock)的原因。
四元数:根据以上原因引入的四元数可以很好解决万向锁问题,UE4中四元数的数据结构为 FQuat,参见 Quat.h。表达四元数的4个变量为 X/Y/Z/W 四元数,可以表示在三维空间中围绕一个轴的旋转。 X, Y, Z, W组件也作为轴/角度格式。
MS_ALIGN(16) struct FQuat
{
public:
/** The quaternion's X-component. */
float X;
/** The quaternion's Y-component. */
float Y;
/** The quaternion's Z-component. */
float Z;
/** The quaternion's W-component. */
float W;
......
在组合四元数时顺序很重要:C = A * B将生成逻辑上的四元数C 首先应用B,然后应用A到任何后续的转换(先右,然后左)。 注意,这是相反的顺序的FTransform的乘法 示例:LocalToWorld = (LocalToWorld * DeltaRotation) 将通过DeltaRotation改变局部空间的旋转。 示例:LocalToWorld = (DeltaRotation * LocalToWorld) 将通过DeltaRotation改变世界空间的旋转。
应用:比如使用Matinee轨迹类型,在各种类型的 Actors 上设置不同类型数据的动画,使用四元数设置旋转插值等。
|