探索构建球体网格的四种方法
去发现同类优质开源项目:https://gitcode.com/
引言
在图形编程中,构建一个球体网格往往需要在质量、构造、内存和渲染成本之间做出权衡。这篇文档将向你介绍四种不同的方法,并对其特性进行深入分析,帮助你在满足需求时做出明智的选择。
球体网格的构建
标准球体(UV 球体)
这是最常见的实现方式,在多数三维工具集如Blender(称为"UV sphere")或3D Max(称为"sphere")中都可以找到。它通过经线(从极点到极点)和纬线(平行于赤道)来划分网格。这使得靠近赤道的面较大,而接近两极的面较小。
for j in parallels_count:
parallel = PI * (j+1) / parallels_count
for i in meridians_count:
meridian = 2.0 * PI * i / meridians_count
return spherical_to_cartesian(meridian, parallel)
归一化立方体
这种方法基于均匀细分的立方体,其中每个顶点位置被归一化并乘以球体半径。结果是产生了一个非均匀细分的球体,近立方体中心的三角形比靠近边缘的三角形大。
for f in faces:
...
for j in subdiv_count:
for i in subdiv_count:
...
return normalize(face_point)
球化立方体
此方法也基于细分立方体,但试图创建更均匀的分割。面的面积和边长的变化较小,但是当点靠近原始立方体的角落时,仍有明显的变形。
...
for j in subdiv_count:
for i in subdiv_count:
...
return (rx, ry, rz)
正二十面体
正二十面体由20个等边三角形组成,每个三角形都有相同的面积,且所有顶点都与其相邻顶点保持相同的距离。为了提高面数,我们需要在每条边上添加一个新的顶点,然后将其归一化,使其位于球体表面。遗憾的是,这破坏了正二十面体的初始性质,三角形不再等边,相邻顶点之间的距离也不再相同。此外,我们每次只能增加四个面。然而,就几乎所有的度量标准来看,除了其面的数量之外,这种方法都是更好的近似。
正二十面体的详细算法因长度问题在此未列出。
为什么一种网格比另一种更好?
由于我们使用三角形近似球体表面,因此首先我们可以衡量从球体表面的许多点到网格的距离作为比较的标准。
另一个要测试的指标是期望三角形面积与实际三角形面积的比例。这对于细分目的来说可能更有意义,因为更均匀的三角形可能会带来更好的效果。
这两个指标将以最大和平均平方误差的形式给出。较小的数字表示更好的性能。
结果
本部分的所有图表都将X轴设为三角形数量,Y轴设为(平均或最大)误差。
到球体距离:平均误差
可以看出,标准球体的平均误差最大,而二面体在所有方法中表现最佳,但由于此处分析的面数有限,我们仅能对二面体进行两次细分,形成320和1280个三角形,这限制了其灵活性。
到球体距离:最大误差
尽管在平均误差上,球化立方体与归一化立方体相当接近,但在最大误差方面,前者明显较差,甚至劣于UV球体。二面体在准确度上仍然优于其他三种方法。
每个三角形的面积:平均平方误差
在这里,球化立方体显示出其优势,它是唯一一个随着三角形数量增加,三角形面积比例与预期面积比例下降的方法。而在二面体中,随着连续细分,每个三角形会生成四个面积稍有差异的新三角形,导致误差增加。
每个三角形的面积:最大平方误差
情况类似于到球体的最大误差,当关注平均误差时,归一化立方体的表现优于UV球体,但在最大误差方面,则相反。在这种情况下,二面体在所有细分级别上都超越了球化立方体,但我们也可以看到错误已经开始上升。
表面距离误差可视化
注意事项
立方体细分的实现会产生边缘上的重复顶点,这可以通过使代码更复杂来避免。
立方体细分的三角化可以改进,使其对立方体面中心对称。
结论
虽然UV球体是最简单的算法,但对于给定数量的三角形而言,其精度最差。如果你需要渲染大量球体或需要高度平滑的球体,那么考虑转向其他任何一种算法可能是更好的选择。
致谢
感谢@ppalmier对此文档的指导。
这个开源项目为你提供了构建球体网格的不同策略,无论你是初学者还是经验丰富的开发者,都能从中受益。无论你需要精确的几何形状,还是高效的渲染优化,这里总有一种方法能满足你的需求。现在就开始探索,让这些技术为你的项目增添新的活力吧!
去发现同类优质开源项目:https://gitcode.com/