UE4中三维⼏何总结——⼏何学基础
UE4中三维⼏何学总结——⼏何学基础
1、简述
此⽂⽬的总结三维⼏何学基础,可以依此提纲做发散,不局限为UE4,任何三维领域系统均可以使⽤学习
2、三维坐标系统
笛卡尔坐标系(直⾓坐标系)
左/右⼿坐标系
局部坐标系
世界坐标系(3D世界的基础坐标系)
视空间(观察空间和摄像机空间,将世界空间转换为摄像机视野前⾯的坐标)
裁剪空间与设备坐标(通过投影矩阵将物体从观察空间转换到裁剪空间,并转换到指定范围的设备坐标中,最终映射到屏幕空间,表现为近⼤远⼩)
3、向量和运算
向量:在三维空间作为物理⾓度的向量具有以下特点
向量就是具有⼤⼩和长度的量
向量就是空间空的箭头
向量可以随意平移
举例:⼒,force;速度,velocity。这些都是具有⼤⼩和⽅向的量,都可以看成是向量。具体向量加减乘除运算规则这⾥不做讲解。
可以查看描述
点积 :A向量在B向量的投影,与B向量的长度乘积
UE4中使⽤为 FVector::CrossProduct()
主要⽤来计算夹⾓,⽐如处理Lambert光照,光源⽅向与物体表⾯⽅向的夹⾓,判断⽬标是否在视野等
叉积:垂直于两个向量的向量,如果以AB向量为边构成⼀个平⾏四边形,那么这两个向量外积的模长与这个平⾏四边形的⾯积。
UE4中使⽤为 FVector::DotProduct(),
矩阵与线性运算:
线性变换是操作空间的⼀种⼿段,它能够保持⽹格线平⾏且等距,并保持原点不动;
矩阵乘法可以视为⼀种基向量的线性组合
矩阵乘法为计算线性变换作⽤于特定向量提供了⼀种途径,以⼆维空间中的变换为例: 经过⼀定的线性变换,我们关注基坐标变换后的位置,将其新的位置坐标构成矩阵,特别地,矩阵的列向量为描述线性变换提供了可能。
矩阵可以理解为⼀种线性变换,这样将有助于矩阵乘法、⾏列式、基变换、特征值的理解。
4、三维坐标变化
UE4中,三维空间内的某个"朝向",其实有3种表达⽅式:⽅向向量、欧拉⾓、四元数。⽽且这⼏种表达⽅式,可以相互转换。单人开发选ue4还是unity
欧拉⾓:欧拉⾓使⽤最简单的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 上设置不同类型数据的动画,使⽤四元数设置旋转插值等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论