UE4投影矩阵
正交投影
class FOrthoMatrix
: public FMatrix
{
public :
FOrthoMatrix ( float Width, float Height, float ZScale, float ZOffset) ;
} ;
class FReversedZOrthoMatrix : public FMatrix
{
public :
FReversedZOrthoMatrix ( float Width, float Height, float ZScale, float ZOffset) ;
} ;
FORCEINLINE FOrthoMatrix:: FOrthoMatrix ( float Width, float Height, float ZScale, float ZOffset)
: FMatrix (
FPlane ( ( Width) ? ( 1.0f / Width) : 1.0f , 0.0f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , ( Height) ? ( 1.0f / Height) : 1.f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , 0.0f , ZScale, 0.0f ) ,
FPlane ( 0.0f , 0.0f , ZOffset * ZScale, 1.0f )
)
{ }
FORCEINLINE FReversedZOrthoMatrix:: FReversedZOrthoMatrix ( float Width, float Height, float ZScale, float ZOffset)
: FMatrix (
FPlane ( ( Width) ? ( 1.0f / Width) : 1.0f , 0.0f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , ( Height) ? ( 1.0f / Height) : 1.f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , 0.0f , - ZScale, 0.0f ) ,
FPlane ( 0.0f , 0.0f , 1.0 - ZOffset * ZScale, 1.0f )
)
{ }
透视投影
class FPerspectiveMatrix
: public FMatrix
{
public :
#define Z_PRECISION 0.0f
FPerspectiveMatrix ( float HalfFOVX, float HalfFOVY, float MultFOVX, float MultFOVY, float MinZ, float MaxZ) ;
FPerspectiveMatrix ( float HalfFOV, float Width, float Height, float MinZ, float MaxZ) ;
FPerspectiveMatrix ( float HalfFOV, float Width, float Height, float MinZ) ;
} ;
class FReversedZPerspectiveMatrix : public FMatrix
{
public :
FReversedZPerspectiveMatrix ( float HalfFOVX, float HalfFOVY, float MultFOVX, float MultFOVY, float MinZ, float MaxZ) ;
FReversedZPerspectiveMatrix ( float HalfFOV, float Width, float Height, float MinZ, float MaxZ) ;
FReversedZPerspectiveMatrix ( float HalfFOV, float Width, float Height, float MinZ) ;
} ;
#if _MSC_VER
#pragma warning (push)
#pragma warning (disable : 4723)
#endif
FORCEINLINE FPerspectiveMatrix:: FPerspectiveMatrix ( float HalfFOVX, float HalfFOVY, float MultFOVX, float MultFOVY, float MinZ, float MaxZ)
: FMatrix (
FPlane ( MultFOVX / FMath:: Tan ( HalfFOVX) , 0.0f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , MultFOVY / FMath:: Tan ( HalfFOVY) , 0.0f , 0.0f ) ,
FPlane ( 0.0f , 0.0f , ( ( MinZ == MaxZ) ? ( 1.0f - Z_PRECISION) : MaxZ / ( MaxZ - MinZ) ) , 1.0f ) ,
FPlane ( 0.0f , 0.0f , - MinZ * ( ( MinZ == MaxZ) ? ( 1.0f - Z_PRECISION) : MaxZ / ( MaxZ - MinZ) ) , 0.0f )
)
{ }
FORCEINLINE FPerspectiveMatrix:: FPerspectiveMatrix ( float HalfFOV, float Width, float Height, float MinZ, float MaxZ)
: FMatrix (
FPlane ( 1.0f / FMath:: Tan ( HalfFOV) , 0.0f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , Width / FMath:: Tan ( HalfFOV) / Height, 0.0f , 0.0f ) ,
FPlane ( 0.0f , 0.0f , ( ( MinZ == MaxZ) ? ( 1.0f - Z_PRECISION) : MaxZ / ( MaxZ - MinZ) ) , 1.0f ) ,
FPlane ( 0.0f , 0.0f , - MinZ * ( ( MinZ == MaxZ) ? ( 1.0f - Z_PRECISION) : MaxZ / ( MaxZ - MinZ) ) , 0.0f )
)
{ }
FORCEINLINE FPerspectiveMatrix:: FPerspectiveMatrix ( float HalfFOV, float Width, float Height, float MinZ)
: FMatrix (
FPlane ( 1.0f / FMath:: Tan ( HalfFOV) , 0.0f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , Width / FMath:: Tan ( HalfFOV) / Height, 0.0f , 0.0f ) ,
FPlane ( 0.0f , 0.0f , ( 1.0f - Z_PRECISION) , 1.0f ) ,
FPlane ( 0.0f , 0.0f , - MinZ * ( 1.0f - Z_PRECISION) , 0.0f )
)
{ }
FORCEINLINE FReversedZPerspectiveMatrix:: FReversedZPerspectiveMatrix ( float HalfFOVX, float HalfFOVY, float MultFOVX, float MultFOVY, float MinZ, float MaxZ)
: FMatrix (
FPlane ( MultFOVX / FMath:: Tan ( HalfFOVX) , 0.0f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , MultFOVY / FMath:: Tan ( HalfFOVY) , 0.0f , 0.0f ) ,
FPlane ( 0.0f , 0.0f , ( ( MinZ == MaxZ) ? 0.0f : MinZ / ( MinZ - MaxZ) ) , 1.0f ) ,
FPlane ( 0.0f , 0.0f , ( ( MinZ == MaxZ) ? MinZ : - MaxZ * MinZ / ( MinZ - MaxZ) ) , 0.0f )
)
{ }
FORCEINLINE FReversedZPerspectiveMatrix:: FReversedZPerspectiveMatrix ( float HalfFOV, float Width, float Height, float MinZ, float MaxZ)
: FMatrix (
FPlane ( 1.0f / FMath:: Tan ( HalfFOV) , 0.0f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , Width / FMath:: Tan ( HalfFOV) / Height, 0.0f , 0.0f ) ,
FPlane ( 0.0f , 0.0f , ( ( MinZ == MaxZ) ? 0.0f : MinZ / ( MinZ - MaxZ) ) , 1.0f ) ,
FPlane ( 0.0f , 0.0f , ( ( MinZ == MaxZ) ? MinZ : - MaxZ * MinZ / ( MinZ - MaxZ) ) , 0.0f )
)
{ }
FORCEINLINE FReversedZPerspectiveMatrix:: FReversedZPerspectiveMatrix ( float HalfFOV, float Width, float Height, float MinZ)
: FMatrix (
FPlane ( 1.0f / FMath:: Tan ( HalfFOV) , 0.0f , 0.0f , 0.0f ) ,
FPlane ( 0.0f , Width / FMath:: Tan ( HalfFOV) / Height, 0.0f , 0.0f ) ,
FPlane ( 0.0f , 0.0f , 0.0f , 1.0f ) ,
FPlane ( 0.0f , 0.0f , MinZ, 0.0f )
)
{ }
使用
FMinimalViewInfo:: CalculateProjectionMatrixGivenView ( ControllingActorViewInfo, AspectRatioAxisConstraint, Viewport, ViewInitOptions) ;
{
if ( ViewInfo. ProjectionMode == ECameraProjectionMode:: Orthographic)
{
const float YScale = 1.0f / ViewInfo. AspectRatio;
const float OrthoWidth = ViewInfo. OrthoWidth / 2.0f ;
const float OrthoHeight = ViewInfo. OrthoWidth / 2.0f * YScale;
const float NearPlane = ViewInfo. OrthoNearClipPlane;
const float FarPlane = ViewInfo. OrthoFarClipPlane;
const float ZScale = 1.0f / ( FarPlane - NearPlane) ;
const float ZOffset = - NearPlane;
InOutProjectionData. ProjectionMatrix = FReversedZOrthoMatrix (
OrthoWidth,
OrthoHeight,
ZScale,
ZOffset
) ;
}
else
{
InOutProjectionData. ProjectionMatrix = FReversedZPerspectiveMatrix (
FMath:: Max ( 0.001f , ViewInfo. FOV) * ( float ) PI / 360.0f ,
ViewInfo. AspectRatio,
1.0f ,
GNearClippingPlane ) ;
}
}
参考链接
UE4 投影矩阵