3D码农建模 - 正多面体

在三维形状中,正多面体指各面都是全等的正多边形且每一个顶点所接的面数都是一样的凸多面体,符合这种特性的立体总共有5种: 正四面体, 正六面体, 正八面体, 正十二面体, 和正二十面体。

以下Python代码给出了在Blender 4中实现这些正多面体的方法,其中正六面体和正二十面体使用Blender基本形状实现,其它的则计算各个顶点的坐标然后连点成面以构造三维形状。

正四面体, 每面都是正三角形

Python 复制代码
def tetrahedron():
  edge_length = 4

  a = edge_length / (2.0 * math.sqrt(2.0))
  verts = [
      ( a,  a,  a),
      ( a, -a, -a),
      (-a,  a, -a),
      (-a, -a,  a),
  ]

  faces = [[0,1,2],[0,2,3],[0,3,1],[1,3,2]]

  mesh = bpy.data.meshes.new('mesh_tetrahedron')
  obj  = bpy.data.objects.new('tetrahedron', mesh)
  bpy.context.collection.objects.link(obj)

  mesh.from_pydata(verts, [], faces)
  mesh.update(calc_edges=True)

正六面体, 每面都是正四边形

Python 复制代码
def cube():
  ledge_length = 4

  bpy.ops.mesh.primitive_cube_add(
    size = ledge_length
  )

正八面体, 每面都是正三角形

Python 复制代码
def octahedron():
  ledge_length = 4
  a = ledge_length/sqrt(2)

  verts = [
    (a, 0, 0),
    (-a, 0, 0),
    (0, a, 0),
    (0, -a, 0),
    (0, 0, a),
    (0, 0, -a)
  ]

  faces = [[4,0,2],[4,2,1],[4,1,3],[4,3,0],[5,2,0],[5,1,2],[5,3,1],[5,0,3]]
  
  mesh = bpy.data.meshes.new('mesh_octahedron')
  obj  = bpy.data.objects.new('octahedron', mesh)
  bpy.context.collection.objects.link(obj)

  mesh.from_pydata(verts, [], faces)
  mesh.update(calc_edges=True)

正十二面体, 每面都是正五边形

Python 复制代码
def dodecahedron():
  ledge_length = 4

  golden_ratio = (1 + sqrt(5)) / 2

  s = ledge_length * golden_ratio / 2
  t = s / golden_ratio
  u = s * golden_ratio

  verts = [(s,s,s),(s,s,-s),(s,-s,s),(s,-s,-s),(-s,s,s),(-s,s,-s),(-s,-s,s),(-s,-s,-s),
             (t,u,0),(-t,u,0),(t,-u,0),(-t,-u,0),(u,0,t),(u,0,-t),(-u,0,t),(-u,0,-t),(0,t,u),
             (0,-t,u),(0,t,-u),(0,-t,-u)]

  faces = [[0,8,9,4,16],[0,12,13,1,8],[0,16,17,2,12],[8,1,18,5,9],[12,2,10,3,13],
            [16,4,14,6,17],[9,5,15,14,4],[6,11,10,2,17],[3,19,18,1,13],[7,15,5,18,19],
            [7,11,6,14,15],[7,19,3,10,11]]

  mesh = bpy.data.meshes.new('mesh_dodecahedron')
  obj  = bpy.data.objects.new('dodecahedron', mesh)
  bpy.context.collection.objects.link(obj)

  mesh.from_pydata(verts, [], faces)
  mesh.update(calc_edges=True)

正二十面体, 每面都是正三角形

Python 复制代码
def icosahedron():
  edge_length = 4

  bpy.ops.mesh.primitive_ico_sphere_add(
    radius = (edge_length / 4) * sqrt(10 + 2 * sqrt(5)),
    subdivisions = 1
  )
相关推荐
好家伙VCC5 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
前端玖耀里6 小时前
如何使用python的boto库和SES发送电子邮件?
python
serve the people6 小时前
python环境搭建 (十二) pydantic和pydantic-settings类型验证与解析
java·网络·python
小天源6 小时前
Error 1053 Error 1067 服务“启动后立即停止” Java / Python 程序无法后台运行 windows nssm注册器下载与报错处理
开发语言·windows·python·nssm·error 1053·error 1067
喵手7 小时前
Python爬虫实战:HTTP缓存系统深度实战 — ETag、Last-Modified与requests-cache完全指南(附SQLite持久化存储)!
爬虫·python·爬虫实战·http缓存·etag·零基础python爬虫教学·requests-cache
喵手7 小时前
Python爬虫实战:容器化与定时调度实战 - Docker + Cron + 日志轮转 + 失败重试完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·容器化·零基础python爬虫教学·csv导出·定时调度
2601_949146537 小时前
Python语音通知接口接入教程:开发者快速集成AI语音API的脚本实现
人工智能·python·语音识别
寻梦csdn8 小时前
pycharm+miniconda兼容问题
ide·python·pycharm·conda
Java面试题总结9 小时前
基于 Java 的 PDF 文本水印实现方案(iText7 示例)
java·python·pdf
不懒不懒9 小时前
【决策树算法实战指南:从原理到Python实现】
python·决策树·id3·c4.5·catr