点击上方 编程学习者社区,选择 创建星标
回复关键字 资源 获取编程资源
通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的:
![47112b9ac0f206b4a242300f28fc4a8d.png](https://i-blog.csdnimg.cn/blog_migrate/41662950e4050c77ed2ace2f72047f18.jpeg)
这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图。
八面体
我们先以下面这个八面体为例。
![003f65fb7d8289dcf549421807e7b537.png](https://i-blog.csdnimg.cn/blog_migrate/03f284e8d44aa3ebd552e1e5edd3a54e.jpeg)
1、安装相关包
首先安装两个必备包:
import pyrr # NumPy 的 3D 函数库
import svgwrite # svg图形处理库
2、定义 3D 图生成环境
接下来定义几个类设置好 3 维图基础环境:
![91c792096838361a098a9aa0ebe1e19c.png](https://i-blog.csdnimg.cn/blog_migrate/fae531c22cbaf4ab8d72e7acb9b71ddd.jpeg)
viewport :矩形图范围
camera:包括视图矩阵和投影矩阵
mesh:svg 矢量图所需的网格表面矩阵、着色器和样式字典
3、生成八面体数据
然后生成八面体每个定点的数据:
def octahedron():
"""Construct an eight-sided polyhedron"""
f = sqrt(2.0) / 2.0
verts = numpy.float32([ ( 0, -1, 0), (-f, 0, f), ( f, 0, f), ( f, 0, -f), (-f, 0, -f), ( 0, 1, 0) ])
triangles = numpy.int32([ (0, 2, 1), (0, 3, 2), (0, 4, 3), (0, 1, 4), (5, 1, 2), (5, 2, 3), (5, 3, 4), (5, 4, 1) ])
return verts[triangles]
4、pyrr 包渲染
接下来利用 pyrr 3维库渲染上面的原始数据,最后生成 svg 矢量图。
![7ce5c8956123c268a46f999f7ef250c2.png](https://i-blog.csdnimg.cn/blog_migrate/0ac1a6dd795345bb2f0a29d35d59d267.jpeg)
5、生成 svg
上面最后一步生成 svg 图形,需要调用下面的 Engine 函数,略微有些复杂:
![21bb7542480c293e716e0e33a6cc0935.png](https://i-blog.csdnimg.cn/blog_migrate/81b525a672ac7894a21abacaca53cdf2.jpeg)
以上代码全部封装到类中调用,就可以生成八面体图形了。
除了八面体还可以生成很多其他图形。
球体和 Klein 瓶
![d94e645bccb5d96a39b644f5b1bfde1b.png](https://i-blog.csdnimg.cn/blog_migrate/15d52ed92683439d148296ce933ec4e8.jpeg)
代码如下:
![80d9f9005619c8f9eb02f6ac822d88de.png](https://i-blog.csdnimg.cn/blog_migrate/8d6e00560e76630b951d6bd0037dea0c.jpeg)
多面球体
![a551354e6e68c1014bfb02069e070aac.png](https://i-blog.csdnimg.cn/blog_migrate/8c8094dd416dcbc09af1d98419804132.jpeg)
代码如下:
![3e8a8d9177c75995c04a75a9cf7d2b88.png](https://i-blog.csdnimg.cn/blog_migrate/31dacb7062717c1b06af88705406ba31.jpeg)
发光的球体
![29df8e6fddbe771149b94c68cbeeff93.png](https://i-blog.csdnimg.cn/blog_migrate/02c6c9c0717ada455412c885c7b2e071.jpeg)
代码实现:
![1bf2172ae5e04fa29fce6d5190adc9e1.png](https://i-blog.csdnimg.cn/blog_migrate/488ccdbb336de52ea93380e7ab523452.jpeg)
还可以绘制这种曲面体
![d3233e950ad52d6c0399ce2bd72b4f8e.png](https://i-blog.csdnimg.cn/blog_migrate/0d92d51eec126eaabf3d8ed699a1009e.jpeg)
代码实现如下:
![648e11eede39f592eb9b1ad6771a3882.png](https://i-blog.csdnimg.cn/blog_migrate/550c773c67a863a5124db723c8d77fb4.jpeg)
来源:高级农民工
作者:苏克1900
往期精选
在知乎上学Python-入门篇在知乎上学爬虫大家都用什么背英语单词Python库分享![864d07834288ae0eed6db5d9883cb0e3.gif](https://i-blog.csdnimg.cn/blog_migrate/ff85d35fb5a2f9d5bf30e296a3394533.gif)
![354444eed77f4b494cc1de68dbd17d2d.gif](https://i-blog.csdnimg.cn/blog_migrate/befdb6d13be284609de3e13bdc6c9c19.gif)