欢迎光临散文网 会员登陆 & 注册

利用Godot演示球体生成的4种不同的方法

2023-08-06 22:14 作者:轻狂的东邪君  | 我要投稿


项目地址: https://gitee.com/stanleylam19/godot-generate-sphere

许可证: WTFPL ("你他妈的想干嘛就干嘛")

视频演示: Godot写的4种生成球体的方法演示


演示操作可以参考上面视频,本文的作用主要是解释程序上这4种方法理论上的生成过程

1. Polar Sphere (基于极坐标生成的球体)

三维球体的极坐标

根据上述公式中的θ和φ这两个角度的变化来得到球体的点

演示程序中得到球体是把θ和φ分成 100 等分后渲染的结果

可修改程序中 PolorSphere.gd 的 X_SEGMENTS 和 Y_SEGMENTS 变量来调整θ和φ的分割数量以观察不同的球体渲染结果


2. Cube Sphere (基于正方体生成的球体)


正方体

这种生成方法也可以很直观的理解,有六面的正方体,按照一个数n来分成n个小正方形

然后将得到的点作归一化 (Normalize) 处理就可以得到球体了

演示程序中得到的球体是每个面被分成 50*50 个正方形渲染的结果

可修改程序中 CubeSphere.gd 的 cube_points 变量来调整正方形的分割数量以观察不同的球体渲染结果,建议设置的数值不宜超过100,否则数值太大程序会卡死


3. Icophere (基于正八面体生成的球体)

利用正三角形各边的中点生成新的小正三角形

基本原理就是透过分裂正三角形来逼近球体

正八面体每个正三角形的面都按照一个数n来分成n个正三角形

然后将所有三角形的点作归一化 (Normalize) 处理就可以得到球体了

从八面体到球体

演示程序中得到的球体是 n=6 即每个面被分成1024三角形后渲染出来的结果

可修改程序中 IcoSphere.gd 的 tri_splitting_level 变量来调整三角形的分割次数以观察不同的球体渲染结果,建议设置的数值不宜超过9,否则数值太大程序会卡死

以下是不同n的情况的数据列表:

4. Hexphere (基于正二十面体生成的六边形表面的球体)


正二十面体
平面展开的正二十面体,可分为上中下5,10,5三组正三角形来处理

正二十面体生成的球体固定会有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

可修改程序中 HexSphere.gd 的 hexasphere_n 变量来调整三角形的分割次数以观察不同的球体渲染结果,建议设置的数值不宜超过7,否则数值太大程序会卡死

以下是不同n的情况的数据列表:


注:其实用正八面体按照述方法也能生成表面为六边形球体

两极和赤道的东南西北向分别都是正方形共有6个固定的正方形

感兴趣的朋友可以自己推导出来,演示代码就不包含此内容了

当正三角形分裂两次后的正八面体草图


利用Godot演示球体生成的4种不同的方法的评论 (共 条)

分享到微博请遵守国家法律