一、平面的描述使用Ax+By+Cz=W的形式。因此在手动计算时要注意不要使用现成的结论:Ax+By+Cz+D=0的形式:
/**
* Structure for three dimensional planes.
*
* Stores the coeffecients as Xx+Yy+Zz=W.
* Note that this is different from many other Plane classes that use Xx+Yy+Zz+W=0.
*/
MS_ALIGN(16) struct FPlane
: public FVector
{
public:
/** The w-component. */
float W;
二从观察点和朝向定义View矩阵
void FViewMatrices::UpdateViewMatrix(const FVector& ViewLocation, const FRotator& ViewRotation)
{
ViewOrigin = ViewLocation;
FMatrix ViewPlanesMatrix = FMatrix(
FPlane(0, 0, 1, 0), //X平面
FPlane(1, 0, 0, 0), //Y平面
FPlane(0, 1, 0, 0), //Z平面
FPlane(0, 0, 0, 1)); //W平面,这个其实就是单纯的满足矩阵的要求,表示是一个点。
ViewMatrix = FTranslationMatrix(-ViewLocation);
ViewMatrix = ViewMatrix * FInverseRotationMatrix(ViewRotation);
//世界坐标到观察坐标的变换:V=World的逆变换 = (旋转矩阵*平移矩阵)的逆变换=平移的逆变换*旋转的逆变换
ViewMatrix = ViewMatrix * ViewPlanesMatrix;
InvViewMatrix = FTranslationMatrix(-ViewMatrix.GetOrigin()) * ViewMatrix.RemoveTranslation().GetTransposed();
// Duplicate HMD rotation matrix with roll removed
FRotator HMDViewRotation = ViewRotation;
HMDViewRotation.Roll = 0.f;
HMDViewMatrixNoRoll = FInverseRotationMatrix(HMDViewRotation) * ViewPlanesMatrix;
PreViewTranslation = -ViewOrigin;
//using mathematical equality rule for matrix inverse: (A*B)^-1 == B^-1 * A^-1
OverriddenTranslatedViewMatrix = TranslatedViewMatrix = FTranslationMatrix(-PreViewTranslation) * ViewMatrix;
OverriddenInvTranslatedViewMatrix = InvTranslatedViewMatrix = InvViewMatrix * FTranslationMatrix(PreViewTranslation);
// Compute a transform from view origin centered world-space to clip space.
TranslatedViewProjectionMatrix = GetTranslatedViewMatrix() * GetProjectionMatrix();
InvTranslatedViewProjectionMatrix = GetInvProjectionMatrix() * GetInvTranslatedViewMatrix();
ViewProjectionMatrix = GetViewMatrix() * GetProjectionMatrix();
InvViewProjectionMatrix = GetInvProjectionMatrix() * GetInvViewMatrix();
}
浙公网安备 33010602011771号