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

本文介绍了Overload游戏引擎的OvRendering函数库,重点解析了Geometry部分的BoundingSphere.h和Vertex.h,以及Data/Frustum.h中的视锥体创建和碰撞检测。BoundingSphere用于碰撞检测,Vertex表示3D空间中的顶点,而Frustum则涉及视锥体的构造和对象在视锥内的判定方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021SC@SDUSC

目录

1.Geometry

1.1BoundingSphere.h

1.2Vertex.h

2.Data/Frustum.h


OvRendering函数库主要包括了几乎全部实现渲染管线的函数。以下是正文部分。

1.Geometry

Geometry中包含了两个函数BoundingSphere.h与Vertex.h,其中分别定义了一个数据结构。

1.1BoundingSphere.h

namespace OvRendering::Geometry
{
	/**
	* Data structure that defines a bounding sphere (Position + radius)
	*/
	struct BoundingSphere
	{
		OvMaths::FVector3 position;
		float radius;
	};
}

这个结构体很简单,我们可以看出他只有两个变量,一个3维向量position和一个单精度浮点数radius。

在实际渲染应用中,BoundingSphere(下文称包围球)用于进行两个对象的碰撞检测,position表示包围球的中心,radius表示包围球的半径。

在3D碰撞检测中,为了加快碰撞检测的效率,减少不必要的碰撞检测,会使用基本几何体作为物体的包围盒(Bounding Volume, BV)进行测试。

当网格对象被赋予了包围球后,当两个包围球发生不碰撞时,则没必要进行更复杂的碰撞检测,于是判定其归属的网格对象未发生碰撞。

在实际应用中,除了球体包围盒,还有AABB, OBB, 8-DOP, Convex Hull这几种常见的包围盒,详细的信息不在这里赘述。

1.2Vertex.h

namespace OvRendering::Geometry
{
	/**
	* Data structure that defines the geometry of a vertex
	*/
	struct Vertex
	{
		float position[3];
		float texCoords[2];
		float normals[3];
		float tangent[3];
		float bitangent[3];
	};
}

Vertex表示一个3维顶点结构,在3D空间中,所有的物体都是一系列顶点经过拓扑连接后产生的网格,所以在渲染过程中,顶点是进行一切计算的基础。

在结构体中,定义了5个数组,其中position表示顶点的空间坐标,texCoords表示顶点的纹理坐标(纹理坐标的作用将在Texture.h中讲解),normals表示顶点所在平面的法向量,tangent表示顶点坐在平面的切向量,bitangent则是前两个向量的叉乘(t x n)。

normals,tangent,bitangent这3个向量用于构建物体表面某个顶点自身的局部坐标系。

这个坐标系将会在以后发挥作用。 

2.Data/Frustum.h

Frustum是截面锥体的意思,正如前文讲过的Perspective矩阵,Frustum.h中主要进行了一个视锥体的创建以及碰撞检测的工作。

namespace OvRendering::Data
{
	/**
	* Mathematic representation of a 3D frustum
	*/
	class Frustum
	{
	public:
 
		void CalculateFrustum(const OvMaths::FMatrix4& p_viewProjection);

		bool PointInFrustum(float p_x, float p_y, float p_z) const;

		bool SphereInFrustum(float p_x, float p_y, float p_z, float p_radius) const;

		bool CubeInFrustum(float p_x, float p_y, float p_z, float p_size) const;

		bool BoundingSphereInFrustum(const OvRendering::Geometry::BoundingSphere& p_boundingSphere, const OvMaths::FTransform& p_transform) const;

		std::array<float, 4> GetNearPlane
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值