Blender繪制基本網(wǎng)格對(duì)象

網(wǎng)格定義

網(wǎng)格是由點(diǎn)、線、面進(jìn)行連接繪制的幾何圖形對(duì)象,Blender中將點(diǎn)、線、面的三維坐標(biāo)信息儲(chǔ)存在數(shù)組中。

繪制網(wǎng)格

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

import bpy

要進(jìn)行最簡單的繪制,將創(chuàng)建三個(gè)空數(shù)組,分別命名為verts,edges,faces代表點(diǎn)、線、面。

# 定義三個(gè)空列表分別用于存儲(chǔ)點(diǎn)、線、面的幾何信息
verts = []
edges = []
faces = []

這其中,verts用于儲(chǔ)存點(diǎn)的三維空間坐標(biāo),現(xiàn)在我們來繪制一個(gè)五面體。

# 定義各個(gè)點(diǎn)的坐標(biāo)
verts = [(2, 0, 4), (4, 1, 4), (4, 5, 4), (1, 4, 4), (3, 3, 7)]

在定義了各個(gè)點(diǎn)的坐標(biāo)之后,就可以開始定義線和面了。

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

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

這里需要注意的一點(diǎn)是,faces[]中的坐標(biāo)實(shí)際上指的是點(diǎn)的連接順序,faces[]中每一個(gè)元組代表一個(gè)面,而元組中的數(shù)代表verts[]中點(diǎn)的序數(shù)。

比如,(0,1,2,3)表示verts[]中第1、2、3、4個(gè)點(diǎn)依次連接。注意,(0,1,2,3)與(3,2,1,0)雖然最終顯示結(jié)果不會(huì)有什么區(qū)別,但是在數(shù)學(xué)上,其正向應(yīng)當(dāng)是相反的,而在Blender中,兩種情況下,法線方向確實(shí)相反,這里后續(xù)可能會(huì)開展一點(diǎn)工作,不過現(xiàn)在不是重心。

定義好點(diǎn)線面之后就可以創(chuàng)建網(wǎng)格對(duì)象并將之鏈接到當(dāng)前工作空間中了,最后使用之前定義好的坐標(biāo)數(shù)據(jù)將網(wǎng)格對(duì)象繪制并顯示在工作空間中。

# 首先新建一個(gè)窗口
bpy.ops.scene.new(type='NEW')

# 創(chuàng)建網(wǎng)格與對(duì)象
fivemesh = bpy.data.meshes.new("fivemesh")
fiveobj = bpy.data.objects.new("fivemeshes", fivemesh)

# 將對(duì)象鏈接到當(dāng)前場(chǎng)景集合中
fiveobj.location = bpy.context.scene.cursor_location
bpy.context.scene.collection.objects.link(fiveobj)

# 根據(jù)python數(shù)據(jù)繪制實(shí)體
fivemesh.from_pydata(verts, edges, faces)
fivemesh.update(calc_edges=True)

在Blender中運(yùn)行代碼顯示結(jié)果如下。


關(guān)于點(diǎn)、線、面數(shù)組是否使用時(shí)的繪制差異

在上文的代碼中,相信細(xì)心的人已經(jīng)發(fā)現(xiàn)了,edges[]數(shù)組為空,我們只定義了verts[]與faces[]。

verts[]無疑是不可或缺的,它是edges[]與faces[]的基礎(chǔ),那么,在faces[]為空或三者均不為空的時(shí)候,會(huì)有什么有趣結(jié)果出現(xiàn)呢?

下面通過一個(gè)實(shí)例來具體說明。

實(shí)現(xiàn)代碼如下。

import bpy

# 分別設(shè)置線列表與面列表為空,顯示結(jié)果不同,最后再與點(diǎn)線面三組屬性設(shè)置均不為空的情況進(jìn)行輸出比較

# 分別定義三組列表用于存儲(chǔ)三種不同情況下幾何體的空間信息
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)]

# 開始圖形的繪制
# 首先打開一個(gè)新圖層
bpy.ops.scene.new(type="NEW")

# 分別創(chuàng)建三個(gè)網(wǎng)格和對(duì)象
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)

# 將這三個(gè)對(duì)象鏈接到當(dāng)前場(chǎng)景集合中
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)

# 根據(jù)python數(shù)據(jù)分別繪制實(shí)體
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)

# 設(shè)置法線可見
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)

輸出結(jié)果如下。



可以看到,在faces[]為空的時(shí)候,繪制的是一個(gè)線框,而在三者均不為空時(shí),在圖形表面出現(xiàn)了線框。

這里也將是后續(xù)工作的一個(gè)研究方向,這里不過多提到。

下一篇文章將是繪制一個(gè)比較復(fù)雜的正在工作的泵,篇幅較長,更新隨緣!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容