Blender Python编程实现程序化建模生成超形示例详解

Jasper
Jasper
发布时间:2026-10-15| 5人浏览过
原创

本文详解如何在Blender中使用Python脚本实现超形(Supershapes)的程序化建模。文章解析了二维及三维超形方程原理,并通过完整代码示例展示如何定义参数生成复杂几何形状,帮助开发者利用自动化脚本替代手动雕刻,提升3D创作效率。

正文

Blender 并非唯一支持通过编程和自动化任务处理场景的3D软件。随着版本迭代,Blender 已逐步发展为涵盖从油脂铅笔草图绘制到基于节点合成等全流程的可靠CG制作解决方案。

实际上,借助 Python 脚本及额外插件,用户可以批量处理对象实例化、程序化生成内容、配置渲染参数,甚至获取项目的自定义统计数据。这种能力不仅减轻了繁琐操作的负担,也让开发者能够更深入地参与到这一创意工具社区中,而不仅仅局限于美术人员。

什么是超形(Supershapes, Superformula)

截图来源于 ShaderToy

二维超形

超形方程由 Johan Gielis 提出,旨在作为自然形状建模框架。二维超形方程是圆方程和椭圆方程的推广形式。

其给出的二维超椭圆/超形通用公式如下。

其中 r 和 phi 代表极坐标(分别表示半径和角度)。

n1、n2、n3、m 均为实数。

a 和 b 为除 0 以外的实数。

当 m = 0 时,结果呈现为圆形,即 r = 1。

n1 = n2 = n3 = 1

增大 m 会增加形状的旋转对称性。这通常适用于 n 为其他值的情况。这些曲线在角 2π/m 的圆上重复出现,在 m 为整数值的多数示例中这一现象尤为明显。

n1 = n2 = n3 = 0.3

当 n 保持相等但数值减小时,形状将变得更加紧凑。

其他特别情况

例子 1

若 n1 略大于 n2 和 n3,则会形成膨胀形态。

下方示例中 n1 = 40 和 n2 = n3 = 10。

例子 2

多边形形状通过极大的 n1 值以及虽大但相等的 n2 和 n3 实现。

例子 3

不对称形状可通过使用不同的 n 值创建。下方示例包含 n1 = 60, n2 = 55 和 n3 = 30。

例子 4

对于 m 的非整数值,若为有理数,所生成的形状依然闭合。下方展示了 n1 = n2 = n3 = 0.3 的示例,角度范围需从 0 扩展至 12π。

例子 5

由于 n1 的值小于 n2 和 n3,形成了光滑的海星形状。下方示例中 m=5 和 n2 = n3 = 1.7。

奇异的形状

感兴趣的用户还可以尝试其他不同的形状组合。

三维超形

在给出上述二维超形定义后,

我们可以利用球形乘积(spherical product)将其扩展至 3D 应用。

Blender 生成超形

基于上述理论支持,我们可以在 Blender 中编写 Python 代码。原理并不复杂,只需套用三维超形公式并定义自定义参数即可。

详细代码和注释如下

import bpy
import math
# mesh 数组(点、面、边)
verts = []
faces = []
edges = []
#3D supershape 参数
m = 14.23
a = -0.06
b = 2.78
n1 = 0.5
n2 = -.48
n3 = 1.5
scale = 3
Unum = 50
Vnum = 50
Uinc = math.pi / (Unum/2)
Vinc = (math.pi/2)/(Vnum/2)
# 套用公式,填充顶点数组
theta = -math.pi
for i in range (0, Unum + 1):
   phi = -math.pi/2
   r1 = 1/(((abs(math.cos(m*theta/4)/a))**n2+(abs(math.sin(m*theta/4)/b))**n3)**n1)
   for j in range(0,Vnum + 1):
       r2 = 1/(((abs(math.cos(m*phi/4)/a))**n2+(abs(math.sin(m*phi/4)/b))**n3)**n1)
       x = scale * (r1 * math.cos(theta) * r2 * math.cos(phi))
       y = scale * (r1 * math.sin(theta) * r2 * math.cos(phi))
       z = scale * (r2 * math.sin(phi))
       vert = (x,y,z) 
       verts.append(vert)
       #增加 phi
       phi = phi + Vinc
   #增加 theta
   theta = theta + Uinc
# ------------------------------------------------------------------------------- 
# 填充面数组
count = 0
for i in range (0, (Vnum + 1) *(Unum)):
    if count < Vnum:
        A = i
        B = i+1
        C = (i+(Vnum+1))+1
        D = (i+(Vnum+1))
        face = (A,B,C,D)
        faces.append(face)
        count = count + 1
    else:
        count = 0
# 创建 mesh 和 object
mymesh = bpy.data.meshes.new("supershape")
myobject = bpy.data.objects.new("supershape",mymesh)
# 设置 mesh 的 location
myobject.location = bpy.context.scene.cursor.location # *
bpy.context.scene.collection.objects.link(myobject) # *
# 从 python 数据创建 mesh
mymesh.from_pydata(verts,edges,faces)
mymesh.update(calc_edges=True)
# 设置 object 为编辑模式
bpy.context.view_layer.objects.active = myobject # *
bpy.ops.object.mode_set(mode='EDIT')
# 移除重复的顶点
bpy.ops.mesh.remove_doubles() 
# 重新计算法线
bpy.ops.mesh.normals_make_consistent(inside=False)
bpy.ops.object.mode_set(mode='OBJECT')
# 新建细分修改器(subdivide modifier)
myobject.modifiers.new("subd", type='SUBSURF')
myobject.modifiers['subd'].levels = 3
# 平滑 mesh
mypolys = mymesh.polygons
for p in mypolys:
    p.use_smooth = True

通过上述代码,我们可以轻松生成如下形状,无需费力进行“雕刻”。

用户还可以自行修改参数,例如“咻得一下”即可得到以下形状,过程十分简单。

以上就是Blender Python编程实现程序化建模生成超形示例详解的详细内容,更多关于Blender Python超形建模的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。