UE4投影矩阵[通俗易懂]

UE4投影矩阵[通俗易懂]UE4投影矩阵正交投影classFOrthoMatrix :publicFMatrix{public: /** *Constructor * *@paramWidthviewspacewidth *@paramHeightviewspaceheight *@paramZScalescaleintheZaxis *@paramZOffsetoffsetintheZaxis */ FOrthoMatrix(flo

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

UE4投影矩阵

正交投影

class FOrthoMatrix
: public FMatrix
{ 

public:
/** * Constructor * * @param Width view space width * @param Height view space height * @param ZScale scale in the Z axis * @param ZOffset offset in the Z axis */
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:
// Note: the value of this must match the mirror in Common.usf!
#define Z_PRECISION 0.0f
/** * Constructor * * @param HalfFOVX Half FOV in the X axis * @param HalfFOVY Half FOV in the Y axis * @param MultFOVX multiplier on the X axis * @param MultFOVY multiplier on the y axis * @param MinZ distance to the near Z plane * @param MaxZ distance to the far Z plane */
FPerspectiveMatrix(float HalfFOVX, float HalfFOVY, float MultFOVX, float MultFOVY, float MinZ, float MaxZ);
/** * Constructor * * @param HalfFOV half Field of View in the Y direction * @param Width view space width * @param Height view space height * @param MinZ distance to the near Z plane * @param MaxZ distance to the far Z plane * @note that the FOV you pass in is actually half the FOV, unlike most perspective matrix functions (D3DXMatrixPerspectiveFovLH). */
FPerspectiveMatrix(float HalfFOV, float Width, float Height, float MinZ, float MaxZ);
/** * Constructor * * @param HalfFOV half Field of View in the Y direction * @param Width view space width * @param Height view space height * @param MinZ distance to the near Z plane * @note that the FOV you pass in is actually half the FOV, unlike most perspective matrix functions (D3DXMatrixPerspectiveFovLH). */
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)
// Disable possible division by 0 warning
#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, /*inout*/ 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
{ 

// Avoid divide by zero in the projection matrix calculation by clamping FOV
InOutProjectionData.ProjectionMatrix = FReversedZPerspectiveMatrix(
FMath::Max(0.001f, ViewInfo.FOV) * (float)PI / 360.0f,
ViewInfo.AspectRatio,
1.0f,
GNearClippingPlane );
}
}

参考链接

UE4 投影矩阵

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185758.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • MPQ Storm库 源代码分析 一个

    MPQ Storm库 源代码分析 一个

  • Weka算法Clusterers-DBSCAN源代码分析

    Weka算法Clusterers-DBSCAN源代码分析

  • PrintWriter用法简析

    PrintWriter用法简析向文本输出流打印对象的格式化表示形式。此类实现在PrintStream中的所有print方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。与Print

  • xray安全漏洞检测(高效能)

    xray安全漏洞检测(高效能)风险告知:请勿在未授权情况下,对网站进行安全扫描,存在很大的法律风险,详细请了解网络安全法。血的案例:”白帽黑客”找漏洞被抓引争议世纪佳缘否认”钓鱼”–传媒–人民网在正式运行xray生成配置文件config.yaml后,请优先修改配置项,确认扫描范围,再重新启动xray如不预先配置,默认扫描所有站点,存在非常大的法律风险,请知悉!!!xray是一款功能强大的安全评估工具,主要特性有:检测速度快。发包速度快;漏洞检测算法高效。 支持范围广。大至OWASPTo.

  • django自定义用户认证_用户自定义的类

    django自定义用户认证_用户自定义的类前言如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的源码分析源码的入口在APIView.py文件下的di

  • Java最新JDK和API下载(持续同步更新于官网)

    Java最新JDK和API下载(持续同步更新于官网)Java最新JDK和API下载(持续同步更新于官网)提供涵盖所有主流操作系统(包括Windows、Linux、MacOS等)的Java最新稳定版JDK和对应API的下载以下所有JavaJDK的安装包、压缩包(免安装版)以及对应的API,均直接来自官网,没有添加其它任何额外内容;旨在便捷地获取最新版的JavaJDK(避免因地域原因被限制访问,因网络原因无法稳定有效下载等情况)更新时间:2021年3月17日…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号