Blender繪制基本網格對象(轉)


網格定義

網格是由點、線、面進行連接繪制的幾何圖形對象,Blender中將點、線、面的三維坐標信息儲存在數組中。

繪制網格

為了使用Blender繪制,我們首先要引入Blender Python庫bpy。

import bpy 

要進行最簡單的繪制,將創建三個空數組,分別命名為verts,edges,faces代表點、線、面。

# 定義三個空列表分別用於存儲點、線、面的幾何信息 verts = [] edges = [] faces = [] 

這其中,verts用於儲存點的三維空間坐標,現在我們來繪制一個五面體。

# 定義各個點的坐標 verts = [(2, 0, 4), (4, 1, 4), (4, 5, 4), (1, 4, 4), (3, 3, 7)] 

在定義了各個點的坐標之后,就可以開始定義線和面了。

線和面非常類似,都是通過點的連接繪制而成,這里以面的定義舉例,具體代碼實現如下。

# 確定面的繪制方法 faces = [(0, 1, 2, 3), (0, 1, 4), (1, 2, 4), (2, 3, 4), (0, 3, 4)] 

這里需要注意的一點是,faces[]中的坐標實際上指的是點的連接順序,faces[]中每一個元組代表一個面,而元組中的數代表verts[]中點的序數。

比如,(0,1,2,3)表示verts[]中第1、2、3、4個點依次連接。注意,(0,1,2,3)與(3,2,1,0)雖然最終顯示結果不會有什么區別,但是在數學上,其正向應當是相反的,而在Blender中,兩種情況下,法線方向確實相反,這里后續可能會開展一點工作,不過現在不是重心。

定義好點線面之后就可以創建網格對象並將之鏈接到當前工作空間中了,最后使用之前定義好的坐標數據將網格對象繪制並顯示在工作空間中。

# 首先新建一個窗口 bpy.ops.scene.new(type='NEW') # 創建網格與對象 fivemesh = bpy.data.meshes.new("fivemesh") fiveobj = bpy.data.objects.new("fivemeshes", fivemesh) # 將對象鏈接到當前場景集合中 fiveobj.location = bpy.context.scene.cursor_location bpy.context.scene.collection.objects.link(fiveobj) # 根據python數據繪制實體 fivemesh.from_pydata(verts, edges, faces) fivemesh.update(calc_edges=True) 

在Blender中運行代碼顯示結果如下。


 
 

關於點、線、面數組是否使用時的繪制差異

在上文的代碼中,相信細心的人已經發現了,edges[]數組為空,我們只定義了verts[]與faces[]。

verts[]無疑是不可或缺的,它是edges[]與faces[]的基礎,那么,在faces[]為空或三者均不為空的時候,會有什么有趣結果出現呢?

下面通過一個實例來具體說明。

實現代碼如下。

import bpy # 分別設置線列表與面列表為空,顯示結果不同,最后再與點線面三組屬性設置均不為空的情況進行輸出比較 # 分別定義三組列表用於存儲三種不同情況下幾何體的空間信息 verts_1 = [(0, 0, 0), (3, 0, 0), (3, 3, 0), (0, 3, 0), (1.5, 1.5, 3)] edges_1 = [] faces_1 = [(0, 1, 4), (1, 2, 4), (2, 3, 4), (0, 3, 4)] verts_2 = [(5, 0, 0), (8, 0, 0), (8, 3, 0), (5, 3, 0), (6.5, 1.5, 3)] edges_2 = [(0, 1), (1, 2), (2, 3), (3, 0), (0, 4), (1, 4), (2, 4), (3, 4)] faces_2 = [] verts_3 = [(0, 5, 0), (3, 5, 0), (3, 8, 0), (0, 8, 0), (1.5, 6.5, 3)] edges_3 = [(0, 1), (1, 2), (2, 3), (3, 0), (0, 4), (1, 4), (2, 4), (3, 4)] faces_3 = [(0, 1, 4), (1, 2, 4), (2, 3, 4), (0, 3, 4)] # 開始圖形的繪制 # 首先打開一個新圖層 bpy.ops.scene.new(type="NEW") # 分別創建三個網格和對象 mesh_1 = bpy.data.meshes.new("mesh_1") obj_1 = bpy.data.objects.new("mesh_1", mesh_1) mesh_2 = bpy.data.meshes.new("mesh_2") obj_2 = bpy.data.objects.new("mesh_2", mesh_2) mesh_3 = bpy.data.meshes.new("mesh_3") obj_3 = bpy.data.objects.new("mesh_3", mesh_3) # 將這三個對象鏈接到當前場景集合中 obj_1.location = bpy.context.scene.cursor_location bpy.context.scene.collection.objects.link(obj_1) obj_2.location = bpy.context.scene.cursor_location bpy.context.scene.collection.objects.link(obj_2) obj_3.location = bpy.context.scene.cursor_location bpy.context.scene.collection.objects.link(obj_3) # 根據python數據分別繪制實體 mesh_1.from_pydata(verts_1, edges_1, faces_1) mesh_2.from_pydata(verts_2, edges_2, faces_2) mesh_3.from_pydata(verts_3, edges_3, faces_3) # 設置法線可見 bpy.context.view_layer.objects.active = obj_1 bpy.ops.object.mode_set(mode='EDIT') for area in bpy.context.screen.areas: if area.type == 'VIEW_3D': bpy.context.space_data.overlay.show_face_normals = True bpy.context.space_data.overlay.normals_length = 2 mesh_1.update(calc_edges=True) mesh_2.update(calc_edges=True) mesh_3.update(calc_edges=True) 

輸出結果如下。


 
 

可以看到,在faces[]為空的時候,繪制的是一個線框,而在三者均不為空時,在圖形表面出現了線框。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM