unreal engine相机视锥体平面法线朝向

链接:按此post所述可以推测,frustum的6个面的normal朝向均是指向视锥体外面的。
佐证:世界坐标原点的CameraComponent->GetCameraView()->GetViewProjectionMatrix()=>OutViewProjectionMatrix->GetFrustumNearPlane()返回的W=【-10】
通过SuraXR项目中编写的IsTriangleOutsideFrustum(TriP0, TriP1, TriP2, CameraComponent)蓝图函数验证,证实上述结论。

章节(12.5) 平面

平面方程的隐式定义:
$$ax + by + cz = d\\ \textbf{p * n} = d$$
点到平面的距离
关于#130里FPlane的定义,其实就是n*p=d的形式。其中x、y、z分量存法线n,w存的d。
实际上,n*p就是OP在方向向量n上的投影,对于平面上所有的点P,其OP在n上的投影都是相同的,即具有相同的d。反过来也就是说:对于一个确定的方向向量n,若有OP在n上的投影(即n*p)相同(记为d),则称这些P在同一个平面上。因此可以用n*p = d来表达一个平面。
而点到平面的距离也可以直观的思考:任意点Q都可以求出其在n上的投影n*q,若Q在平面上,则有n*q=d,若Q在平面的正空间,则有n*q>d,反之若Q在平面的负空间,则有n*q<d。因此Q点到平面的有向距离就是:n*q - d
还有一种定义平面的方式:已知平面法线n,平面上一点p0,那么对于平面上的任一点p,都有n*(p-p0) = 0

Camera视图变换

这里Camera视图变换,就是常说的从世界坐标变换到眼睛坐标。因此View Matrix就是世界系到眼睛坐标系的变换矩阵。
CameraComponent->GetCameraView()->GetViewProjectionMatrix()会同时输出3个矩阵:
这里分析一下UE4里的眼睛坐标系的朝向问题:
  1. 在场景原点放置一个Camera Actor,姿态清零
  2. 在场景原点放置一个Cube Actor,姿态清零
  3. CameraActor->CameraComponent->GetCameraView()->GetViewProjectionMatrix(&OutViewMatrix),用OutViewMatrix.TransformPosition(Cube->GetActorLocation()),打印出这个新的Postion
    • 当CubeActor的位置为(0,0,0)时,打印出(0,0,0,1)
    • 当CubeActor的位置为(10,0,0)时,打印出(0,0,10,1) => 表明UE4里的眼睛坐标系中往前看的方向是该坐标系的Z轴
    • 当CubeActor的位置为(0,10,0)时,打印出(10,0,0,1) => 表明UE4里的眼睛坐标系中往右看的方向是该坐标系的X轴
    • 当CubeActor的位置为(0,0,10)时,打印出(0,10,0,1) => 表明UE4里的眼睛坐标系中往上看的方向是该坐标系的Y轴
  4. 总结一下:UE4里眼睛坐标系为左手系,X->右,Y->上,Z->前。这里的前后左右上下是站在眼睛的角度来说的。
应用:

关于【物体变换】与【坐标系变换】及其矩阵表示

阅读以前写的这篇文章
 【源坐标系的坐标基在目标坐标系里的坐标描述,就是源坐标系到目标坐标系的坐标系变换矩阵】

UE坐标空间、坐标系

注意Clip空间的描述:After the perspective projection matrix was applied. Note that W in Clip space is the same as View Space Z. 也就是说:Wclip=Zeye
在Clip空间内的culling操作:-|w|<=x,y<=|w|, z<=w为可视