unreal engine相机视锥体平面法线朝向
链接:按此post所述可以推测,frustum的6个面的normal朝向均是指向视锥体外面的。
佐证:世界坐标原点的CameraComponent->GetCameraView()->GetViewProjectionMatrix()=>OutViewProjectionMatrix->GetFrustumNearPlane()返回的W=【-10】
佐证:世界坐标原点的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个矩阵:
- View Matrix
- Projection Matrix
- View Projection Matrix
这里分析一下UE4里的眼睛坐标系的朝向问题:
- 在场景原点放置一个Camera Actor,姿态清零
- 在场景原点放置一个Cube Actor,姿态清零
- CameraActor->CameraComponent->GetCameraView()->GetViewProjectionMatrix(&OutViewMatrix),用OutViewMatrix.TransformPosition(Cube->GetActorLocation()),打印出这个新的Postion
- 总结一下:UE4里眼睛坐标系为左手系,X->右,Y->上,Z->前。这里的前后左右上下是站在眼睛的角度来说的。
应用:
- 根据物体的眼睛坐标(即在眼睛坐标系里的坐标)的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为可视