基于Python绘制一个会动的3D立体粽子
粽子曲面
之前通过matplotlib绘制了圆锥曲面,但matplotlib绘制曲面图有几个问题,其中plot_surface需要有规范的xOy坐标,然后根据其坐标绘制z轴参数;plot_trisurf则必须有明确的三角面的顶点。这些限制提高了绘制三维曲面的技术要求,所以接下来用open3d来以点云的形式来绘制一些更复杂的曲面。
首先就是下面这个参数方程对应的曲面

下面是绘图代码
import numpy as np
import open3d as o3d
def getSin(N):
u = np.linspace(0, np.pi*2, N)
v = np.linspace(0, np.pi*2, N)
u,v = np.meshgrid(u,v)
x = np.cos(u).reshape(-1)
y = np.cos(v).reshape(-1)
z = np.cos(u+v).reshape(-1)
return np.array([x,y,z]).T
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(getSin(500))
o3d.visualization.draw_geometries([pcd])
最后效果如下,非常像一个粽子

真·粽子曲面
上面的粽子图,其实是散点图,只不过点数太多,看上去就比较连续,接下来通过open3d,将这个粽子的散点图,转换为粽子曲面。由于曲面生成的本质是绘制三角面,而随着点数的增多,所需绘制时间也就越长,故而少选一些点
tri = o3d.geometry.TriangleMesh pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(getSin(20)) mesh = tri.create_from_point_cloud_alpha_shape(pcd, 2) mesh.compute_vertex_normals() o3d.visualization.draw_geometries([mesh], mesh_show_back_face=True)
其中,o3d.geometry.TriangleMesh是一个类,之所以将其重新赋值,皆因后面调用的生成曲面的方法名字太长,这样可以缩减一下一行的长度。
compute_vertex_normals用于生成法线,如果没有这个,最后得到的曲面是看不出三维效果的。
最终得到的效果如下,像是个金属质感的粽子,还挺好看的

点击Ctrl+数字,可以更改曲面的配色,为了表现得更加细腻,下面用100×100的网格来生成粽子曲面,效果如下

正弦曲面
粽子曲面又叫余弦曲面,如果把cos换成sin,那么就得到了正弦曲面

其绘图代码如下
import numpy as np
import open3d as o3d
def getCos(N):
u = np.linspace(0, np.pi*2, N)
v = np.linspace(0, np.pi*2, N)
u,v = np.meshgrid(u,v)
x = np.sin(u).reshape(-1)
y = np.sin(v).reshape(-1)
z = np.sin(u+v).reshape(-1)
return np.array([x,y,z]).T
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(getCos(500))
pcd.estimate_normals()
o3d.visualization.draw_geometries([pcd])
其中,estimate_normals用于估计点的法线,这样在绘图的时候会产生漂亮的光效,最终绘图结果如下,可见正弦曲面和余弦曲面的确有着类似互补的性质。

到此这篇关于基于Python绘制一个会动的3D立体粽子的文章就介绍到这了,更多相关Python粽子内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
这篇文章主要介绍了python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例,需要的朋友可以参考下2020-02-02
python字符串拼接.join()和拆分.split()详解
这篇文章主要为大家介绍了python字符串拼接.join()和拆分.split(),具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助2021-11-11
Python利用pdfplumber实现读取PDF写入Excel
pdfplumber专注PDF内容提取,例如文本(位置、字体及颜色等)和形状(矩形、直线、曲线),还有解析表格的功能。本文主要为大家介绍如何利用pdfplumber实现读取PDF写入Excel,需要的可以参考一下2022-06-06
对python xlrd读取datetime类型数据的方法详解
今天小编就为大家分享一篇对python xlrd读取datetime类型数据的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-12-12


最新评论