哔哩哔哩2023-08-06 22:09:06
项目地址: /stanleylam19/godot-generate-sphere
许可证: WTFPL ("你他妈的想干嘛就干嘛")
视频演示: Godot写的4种生成球体的方法演示
【资料图】
演示操作可以参考上面视频,本文的作用主要是解释程序上这4种方法理论上的生成过程
1. Polar Sphere (基于极坐标生成的球体)
根据上述公式中的θ和φ这两个角度的变化来得到球体的点
演示程序中得到球体是把θ和φ分成 100 等分后渲染的结果
可修改程序中 的 X_SEGMENTS 和 Y_SEGMENTS 变量来调整θ和φ的分割数量以观察不同的球体渲染结果
2. Cube Sphere (基于正方体生成的球体)
这种生成方法也可以很直观的理解,有六面的正方体,按照一个数n来分成n个小正方形
然后将得到的点作归一化 (Normalize) 处理就可以得到球体了
演示程序中得到的球体是每个面被分成 50*50 个正方形渲染的结果
可修改程序中 的 cube_points 变量来调整正方形的分割数量以观察不同的球体渲染结果,建议设置的数值不宜超过100,否则数值太大程序会卡死
3. Icophere (基于正八面体生成的球体)
基本原理就是透过分裂正三角形来逼近球体
正八面体每个正三角形的面都按照一个数n来分成n个正三角形
然后将所有三角形的点作归一化 (Normalize) 处理就可以得到球体了
演示程序中得到的球体是 n=6 即每个面被分成1024三角形后渲染出来的结果
可修改程序中 的 tri_splitting_level 变量来调整三角形的分割次数以观察不同的球体渲染结果,建议设置的数值不宜超过9,否则数值太大程序会卡死
以下是不同n的情况的数据列表:
4. Hexphere (基于正二十面体生成的六边形表面的球体)
正二十面体生成的球体固定会有12个五边形和若干个六边形
六边形数量公式:
2 * (m*(m+1)/2 + m) * 5 + (m+1)*5*m 注: m = 2^n-1
(在球两边 (非赤道) 的六边形数量) (在球的中间 (赤道) 的六边形数量)
简化后的公式: 10*m*(m+2)
并且五边形之间都是等距步数,步长为2的倍数
生成过程前期基本原理与IcoSphere相同,首先都是透过分裂正三角形得到更多得正三角形
但需要再进一步处理才能得到正五边形和正六边形
用分裂法得到的结果显示五边形都固定在两极和中间位置,六边形也是按一定规律增减的
分裂完成后再找到每个正三角形的中心点按照发现的规律进行联立就可以了 (可参考代码)
演示程序中得到的球体是 n=5 即分成共10230个六边形并且五边形间的步距为32
可修改程序中 的 hexasphere_n 变量来调整三角形的分割次数以观察不同的球体渲染结果,建议设置的数值不宜超过7,否则数值太大程序会卡死
以下是不同n的情况的数据列表:
注:其实用正八面体按照述方法也能生成表面为六边形球体
两极和赤道的东南西北向分别都是正方形共有6个固定的正方形
感兴趣的朋友可以自己推导出来,演示代码就不包含此内容了
关键词: