【Overload游戏引擎】源码分析之十一:OvRendering函数库(九)

本文详细探讨了Overload游戏引擎中Camera类的实现,包括矩阵计算如CalculateProjectionMatrix和CalculateViewMatrix,以及Cache函数。这些函数涉及到摄像机的观察矩阵、投影矩阵的生成,与OvMaths函数库紧密相关,是理解游戏引擎中摄像机变换的关键部分。

2021SC@SDUSC

目录

Camera

1.矩阵计算

1.1CalculateProjectionMatrix

1.2CalculateViewMatrix

2.Cache函数


本节我们来讨论游戏引擎中一个很重要的内容camera(摄像机),在了解相关的代码时,我们需要用到OvTools函数库中的工具,可点击ReferenceOrValue 前往了解。

Camera

Camera类中包含的成员变量较多,大多数数据类型都已在前文提到,例如m_frustum(视锥体对象)、m_viewMatrix(观察矩阵)、m_projectionMatrix(投影矩阵)、m_projectionMode(投影模式,分为ORTHOGRAPHIC(正交投影)与PERSPECTIVE(透视投影),见OvRendering::Settings::EProjectionMode 文件)。

    class Camera
	{
	private:
		OvRendering::Data::Frustum m_frustum;
		OvMaths::FMatrix4 m_viewMatrix;
		OvMaths::FMatrix4 m_projectionMatrix;
        OvRendering::Settings::EProjectionMode m_projectionMode;

		float m_fov;
        float m_size;
		float m_near;
		float m_far;

		OvMaths::FVector3 m_clearColor;

		bool m_frustumGeometryCulling;
		bool m_frustumLightCulling;
	};

除了以上特殊类型的变量外,还有m_fov(视角范围)、m_size(正交投影时视角立方体的边长)、m_near\m_far(摄像机到近\远平面)、m_几何集合剔除)、m_frustumLightCulling(是否进行视锥体灯光剔除)。

接下来大致浏览一遍相关的函数:

	public:
		Camera();

		void CacheMatrices(uint16_t p_windowWidth, uint16_t p_windowHeight, const OvMaths::FVector3& p_position, const OvMaths::FQuaternion& p_rotation);

		void CacheProjectionMatrix(uint16_t p_windowWidth, uint16_t p_windowHeight);

		void CacheViewMatrix(const OvMaths::FVector3& p_position, const OvMaths::FQuaternion& p_rotation);

		void CacheFrustum(const OvMaths::FMatrix4& p_view, const OvMaths::FMatrix4& p_projection);

		float GetFov() const;
        float GetSize() const;
		float GetNear() const;
		float GetFar() const;
		const OvMaths::FVector3& GetClearColor() const;
		const OvMaths::FMatrix4& GetProjectionMatrix() const;
		const OvMaths::FMatrix4& GetViewMatrix() const;
		const OvRendering::Data::Frustum& GetFrustum() const;

		bool HasFrustumGeometryCulling() const;

		bool HasFrustumLightCulling() const;

        OvRendering::Settings::EProjectionMode GetProjectionMode() const;

		void SetFov(float p_value);
        void SetSize(float p_value);
		void SetNear(float p_value);
		void SetFar(float p_value);
		void SetClearColor(const OvMaths::FVector3& p_clearColor);
		void SetFrustumGeometryCulling(bool p_enable);
		void SetFrustumLightCulling(bool p_enable);
        void SetProjectionMode(OvRendering::Settings::EProjectionMode p_projectionMode);

	private:
		OvMaths::FMatrix4 CalculateProjectionMatrix(uint16_t p_windowWidth, uint16_t p_windowHeight) const;
		OvMaths::FMatrix4 CalculateViewMatrix(const OvMaths::FVector3& p_position, const OvMaths::FQuaternion& p_rotation) const;

以上函数中包含着大量set与get函数,即对成员变量赋值与取值,这里就不作介绍,接下来我们一一来看几个关键的函数。

1.矩阵计算

1.1CalculateProjectionMatrix

OvMaths::FMatrix4 OvRendering::LowRenderer::Camera::CalculateProjectionMatrix(uint16_t p_windowWidth, uint16_t p_windowHeight) const
{
    using namespace OvMaths;
    using namespace OvRendering::Settings;

    const auto ratio = p_windowWidth / static_cast<float>(p_windowHeight);

    switch (m_projectionMode)
    {
    case EProjectionMode::ORTHOGRAPHIC:
        return FMatrix4::CreateOrthographic(m_size, ratio, m_near, m_far);

    case EProjectionMode::PERSPECTIVE: 
        return FMatrix4::CreatePerspective(m_fov, ratio, m_near, m_far);

    default:
        return FMatrix4::Identity;
    }
}

CalculateProjectionMatrix函数用于计算当前摄像机的投影矩阵,需要传入的参数是投影窗口的宽度和高度。

首先我们利用窗口的宽高计算宽高比,这里为了使比值的结果为浮点数,需要对宽高做强制类型转换。接下来根据自身的m_projectionMode变量进行分类,对应不同的投影模式调用创建函数,创建函数详见【Overload游戏引擎】源码分析之二:OvMaths函数库(下)

1.2CalculateViewMatrix

OvMaths::FMatrix4 OvRendering::LowRenderer::Camera::CalculateViewMatrix(const OvMaths::FVector3& p_position, const OvMaths::FQuaternion& p_rotation) const
{
	const auto& up = p_rotation * OvMaths::FVector3::Up;
	const auto& forward = p_rotation * OvMaths::FVector3::Forward;

	return OvMaths::FMatrix4::CreateView
	(
		p_position.x, p_position.y, p_position.z,												// Position
		p_position.x + forward.x, p_position.y + forward.y, p_position.z + forward.z,			// LookAt (Position + Forward)
		up.x, up.y, up.z																		// Up Vector
	);
}

观察矩阵的计算与上述类似,需要传入当前摄像机的世界坐标以及对应的旋转变量,这里需要使用OvMaths中定义的默认摄像机的up向量与forward向量,并对其进行旋转变换,最后调用创建函数获得观察矩阵。

2.Cache函数

void OvRendering::LowRenderer::Camera::CacheMatrices(uint16_t p_windowWidth, uint16_t p_windowHeight, const OvMaths::FVector3& p_position, const OvMaths::FQuaternion& p_rotation)
{
	CacheProjectionMatrix(p_windowWidth, p_windowHeight);
	CacheViewMatrix(p_position, p_rotation);
	CacheFrustum(m_viewMatrix, m_projectionMatrix);
}

void OvRendering::LowRenderer::Camera::CacheProjectionMatrix(uint16_t p_windowWidth, uint16_t p_windowHeight)
{
	m_projectionMatrix = CalculateProjectionMatrix(p_windowWidth, p_windowHeight);
}

void OvRendering::LowRenderer::Camera::CacheViewMatrix(const OvMaths::FVector3& p_position, const OvMaths::FQuaternion& p_rotation)
{
	m_viewMatrix = CalculateViewMatrix(p_position, p_rotation);
}

void OvRendering::LowRenderer::Camera::CacheFrustum(const OvMaths::FMatrix4& p_view, const OvMaths::FMatrix4& p_projection)
{
	m_frustum.CalculateFrustum(p_projection * p_view);
}

以上函数完成了对摄像机的所有变换矩阵的赋值,包括投影矩阵、观察矩阵与视锥体变换矩阵,其中涉及的图形学原理已在前文讨论过,相关内容详见【Overload游戏引擎】源码分析之二:OvMaths函数库(下)

内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
在科技快速演进的时代背景下,移动终端性能持续提升,用户对移动应用的功能需求日益增长。增强现实、虚拟现实、机器人导航、自动驾驶辅助、手势识别、物体检测与距离测量等前沿技术正成为研究与应用的热点。作为支撑这些技术的核心,双目视觉系统通过模仿人类双眼的成像机制,同步获取两路图像数据,并借助图像处理与立体匹配算法提取场景深度信息,进而生成点云并实现三维重建。这一技术体系对提高移动终端的智能化程度及优化人机交互体验具有关键作用。 双目视觉系统需对同步采集的两路视频流进行严格的时间同步与空间校正,确保图像在时空维度上精确对齐,这是后续深度计算与立体匹配的基础。立体匹配旨在建立两幅图像中对应特征点的关联,通常依赖复杂且高效的计算算法以满足实时处理的要求。点云生成则是将匹配后的特征点转换为三维空间坐标集合,以表征物体的立体结构;其质量直接取决于图像处理效率与匹配算法的精度。三维重建基于点云数据,运用计算机图形学方法构建物体或场景的三维模型,该技术在增强现实与虚拟现实等领域尤为重要,能够为用户创造高度沉浸的交互环境。 双目视觉技术已广泛应用于多个领域:在增强现实与虚拟现实中,它可提升场景的真实感与沉浸感;在机器人导航与自动驾驶辅助系统中,能实时感知环境并完成距离测量,为路径规划与决策提供依据;在手势识别与物体检测方面,可精准捕捉用户动作与物体位置,推动人机交互设计与智能识别系统的发展。此外,结合深度计算与点云技术,双目系统在精确距离测量方面展现出显著潜力,能为多样化的应用场景提供可靠数据支持。 综上所述,双目视觉技术在图像处理、深度计算、立体匹配、点云生成及三维重建等环节均扮演着不可或缺的角色。其应用跨越多个科技前沿领域,不仅推动了移动设备智能化的发展,也为丰富交互体验提供了坚实的技术基础。随着相关算法的持续优化与硬件性能的不断提升,未来双目视觉技术有望在各类智能系统中实现更广泛、更深层次的应用。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值