基于Python繪制一個會動的3D立體粽子
粽子曲面
之前通過matplotlib繪制了圓錐曲面,但matplotlib繪制曲面圖有幾個問題,其中plot_surface需要有規(guī)范的xOy坐標(biāo),然后根據(jù)其坐標(biāo)繪制z軸參數(shù);plot_trisurf則必須有明確的三角面的頂點(diǎn)。這些限制提高了繪制三維曲面的技術(shù)要求,所以接下來用open3d來以點(diǎn)云的形式來繪制一些更復(fù)雜的曲面。
首先就是下面這個參數(shù)方程對應(yīng)的曲面
下面是繪圖代碼
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])
最后效果如下,非常像一個粽子
真·粽子曲面
上面的粽子圖,其實(shí)是散點(diǎn)圖,只不過點(diǎn)數(shù)太多,看上去就比較連續(xù),接下來通過open3d,將這個粽子的散點(diǎn)圖,轉(zhuǎn)換為粽子曲面。由于曲面生成的本質(zhì)是繪制三角面,而隨著點(diǎn)數(shù)的增多,所需繪制時間也就越長,故而少選一些點(diǎn)
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是一個類,之所以將其重新賦值,皆因后面調(diào)用的生成曲面的方法名字太長,這樣可以縮減一下一行的長度。
compute_vertex_normals用于生成法線,如果沒有這個,最后得到的曲面是看不出三維效果的。
最終得到的效果如下,像是個金屬質(zhì)感的粽子,還挺好看的
點(diǎn)擊Ctrl
+數(shù)字,可以更改曲面的配色,為了表現(xiàn)得更加細(xì)膩,下面用100×100的網(wǎng)格來生成粽子曲面,效果如下
正弦曲面
粽子曲面又叫余弦曲面,如果把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用于估計點(diǎn)的法線,這樣在繪圖的時候會產(chǎn)生漂亮的光效,最終繪圖結(jié)果如下,可見正弦曲面和余弦曲面的確有著類似互補(bǔ)的性質(zhì)。
到此這篇關(guān)于基于Python繪制一個會動的3D立體粽子的文章就介紹到這了,更多相關(guān)Python粽子內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python GUI庫圖形界面開發(fā)之PyQt5圖片顯示控件QPixmap詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5圖片顯示控件QPixmap詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02

python字符串拼接.join()和拆分.split()詳解

Numpy將二維數(shù)組添加到空數(shù)組的實(shí)現(xiàn)

使用Python實(shí)現(xiàn)火車票查詢系統(tǒng)(帶界面)

Python利用pdfplumber實(shí)現(xiàn)讀取PDF寫入Excel

python3實(shí)現(xiàn)UDP協(xié)議的服務(wù)器和客戶端

對python xlrd讀取datetime類型數(shù)據(jù)的方法詳解