1、简述
此文目的总结三维几何学基础——几何体,可以依此提纲做发散,不局限为UE4,任何三维领域系统均可以使用学习
几何体用于构建刚体的形状,作为碰撞触发器,以及作为场景查询系统中的体积。还可以用于测试几何体之间的交集、光线投射以及将一个几何体扫描到另一个几何体。以下主要介绍几种常见的几何体模块。
2、基本图元
基本图元指的是数学描述中的基本模块,三维中的模块为正方体、圆球和圆锥等,在osg中,使用Drawable类将这些图元进行存储,二维中的模块为正方形、三角形等,二维的几何模块使用Geometry保存。二维和三维图元最后都需要保存在Geode容器中。
几何图形是值类型,继承自公共基类Geometry。每个几何类定义具有固定位置和方向的体积块或曲面。变换指定在其中解释几何图形的框架。
3、几何图元类型
常见3D几何图元:
球体:由一个属性(即其半径)指定,并以原点为中心
胶囊体:以原点为中心。它由半径和半高度值指定,其轴沿正 X 轴和负 X 轴延伸
要创建几何图形是直立的胶囊的动态Actor,形状需要相对变换,使其围绕Z轴旋转四分之一圈。通过这样做,胶囊将沿着Actor的Y轴而不是X轴延伸。设置形状和Actor与设置球体相同
盒体Box:包含三个边长的属性
通过Box/ 胶囊体,可以把复杂物体房子等简化为胶囊
平面Plane:平面将空间划分为"上方"和"下方"
Plane 在几何学没有属性,因为形状的姿势完全定义了平面的碰撞体积
具有PlaneGeometry 的形状只能为静态Actor创建
凸面网格Convex Mesh:如果给定形状中的任意两个点,该形状包含它们之间的线,则该形状是凸面的
三角形网格Triangle Mesh:与图形三角形网格一样,碰撞三角形网格由顶点和三角形索引的集合组成
高度场Height Field:顾名思义,可以用于制作山体、地形等
3.1 凸面网格Convex Mesh
创建步骤:
- 定义凸对象的顶点 例如金字塔的五个点
- 构造凸数据布局的描述 例如顶点数量 标志flag
- Cooking库构建 Convex Mesh
- 创建形状,该几何图形对网格进行实例化
仅提供顶点:
Cooking步骤:
COMPUTE_CONVEX标志来计算网格
在没有Inflation的情况下,cooking会创建一个凸网格,其顶点是原始顶点的子集,并且顶点的数量保证不超过指定的最大值。Inflation将斜角锐边,这可能会增加超出指定最大值的新顶点。此外,斜角可能会产生小三角形, 首先,它试图在没有Inflation的情况下制造壳 。如果失败,它会尝试Inflation,如果也失败了,则使用AABB或OBB。
AABB:Axis-Aligned Bounding Box,轴对齐包围盒
OBB:Oriented Bounding Box,有向包围盒
包围球:外接球
OBB比包围球和AABB更加逼近物体,能显著减少包围体的个数
凸面cooking应用以下步骤:
• 清理顶点 - 删除重复项等
• 查找包含输入集的顶点子集,即顶点有限
• 如果需要Inflation,斜角锐边并添加其他顶点
• 为新面创建多边形
• 计算顶点映射表(每个顶点至少需要 3 个相邻面)
• 检查多边形数据 - 验证所有顶点都在壳上或壳体内部,等等
• 计算质量和惯性张量,假设密度为 1
• 保存数据以进行流式传输
提供顶点和面:
提供点和面后,相关的SDK 会验证网格并直接创建Convexmesh。这是创建凸网格的最快方法。需要每个顶点至少有 3 个相邻面。
凸面cooking过程中的内部步骤:
• 计算顶点映射表,每个顶点至少需要 3 个相邻面
• 检查多边形数据 - 检查所有顶点是否都在壳上或壳体内部,等等
• 计算质量和惯性张量,假设密度为 1
• 保存数据以进行流式传输
3.2 三角形网格Triangle Mesh
三角形网格可以说是被使用最多的一种场景的表达形式,与图形三角形网格一样,碰撞三角形网格由顶点和三角形索引的集合组成。
三角形网格cooking过程如下:
• 检查输入顶点的有效性
• 焊接顶点并检查三角形尺寸
• 为查询创建加速结构
• 计算边缘凸性信息和邻接
• 保存数据以进行流式传输
3.3 高度场Height Field
高度字段的局部空间轴为:
行 - X 轴、列 - Z 轴、高度 - Y 轴
顾名思义,地形只能通过常规矩形采样网格上的高度值来描述:
每个样本都由一个 16 位整数高度值、两个材质(对于样本矩形中的两个三角形)和一个曲面细分标志组成。
标志和材质是指下方和采样点右侧的像元,并指示沿哪个对角线将其拆分为三角形,以及这些三角形的材料。
高度场cooking过程如下:
• 将高度场样本加载到内部存储器中
• 预先计算边缘碰撞信息
• 保存数据以进行流式传输