從知道Blender可以使用bpy自定義腳本開始,我就動(dòng)了學(xué)習(xí)bpy的念頭庸论。
前幾周通過手冊(cè)自學(xué)了Sverchok薇溃,學(xué)習(xí)的過程中也了解了很多Blender操作的原理。Sverchok還有一個(gè)Scripted Node
是通過python腳本添加自定義節(jié)點(diǎn)的汗贫,我也就下了學(xué)習(xí)bpy的決心。
這個(gè)“菜鳥學(xué)bpy”系列算是我bpy過程中的筆記共享秸脱。因?yàn)槲矣X得社區(qū)也有很多像我一樣的沒有編程基礎(chǔ)的菜鳥也想學(xué)習(xí)bpy落包,可能在學(xué)習(xí)中遇到與我一樣的困惑。把這些東西分享出來摊唇,也是希望能有更多人在學(xué)習(xí)過程中少走些彎路咐蝇。當(dāng)然我也是一個(gè)菜鳥,如果里面有錯(cuò)誤之處巷查,也請(qǐng)高手不吝指出有序。_
最后還是要說一句,sv大法好岛请,都來學(xué)sv吧旭寿。。髓需。
1. Blender網(wǎng)格數(shù)據(jù)
學(xué)過幾何的都知道许师,連點(diǎn)成線,連線成面僚匆,blender的網(wǎng)格也是這個(gè)原理來的微渠。
- 點(diǎn):
假設(shè)三維空間中有兩個(gè)點(diǎn),坐標(biāo)為:
verts = [(0,0,0),(1,0,0)]
bpy中點(diǎn)的坐標(biāo)是作為列表數(shù)據(jù)存儲(chǔ)的咧擂,列表中每個(gè)點(diǎn)依次賦予一個(gè)索引值(Index)逞盆,上面兩個(gè)點(diǎn)的索引值就分別為0,1。
- 線:
在bpy數(shù)據(jù)中這兩個(gè)點(diǎn)連線的表示為:
edge = [[0,1]]
bpy中線的數(shù)據(jù)也是作為列表存儲(chǔ)的松申,兩點(diǎn)成線云芦,取兩個(gè)頂點(diǎn)的索引值,我們就得到了一條位于X軸的線段。
- 面:
大家都知道三個(gè)點(diǎn)才能決定一個(gè)平面贸桶,所以要得到一個(gè)面舅逸,我們必須至少有3個(gè)點(diǎn):
verts = [(0,0,0),(1,0,0),(0,1,0)]
然后我們用一個(gè)索引列表把這三個(gè)點(diǎn)連起來皇筛,就得到了一個(gè)面:
face = [[0,1,2]]
bpy中面的數(shù)據(jù)也是作為列表存儲(chǔ)的琉历,把一個(gè)面包含的所有點(diǎn)作為面數(shù)據(jù)的一個(gè)子列表,blender會(huì)自動(dòng)將其閉合,然后我們看到了一個(gè)位于XY平面的三角面水醋。
2. 用bpy新建一個(gè)四棱錐
首先四棱錐是由5個(gè)點(diǎn)組成的旗笔,有4個(gè)三角面和1個(gè)矩形面。
下面話不多說拄踪,上代碼蝇恶。
import bpy #加載bpy,這個(gè)是必須有的
#頂點(diǎn)
verts = [(1,1,0),
(-1,1,0),
(-1,-1,0),
(1,-1,0),
(0,0,2)]
#邊
edges = [(0,1),
(1,2),
(2,3),
(3,0),
(0,4),
(1,4),
(2,4),
(3,4)]
#面
faces = [(0,1,4),
(1,2,4),
(2,3,4),
(3,0,4),
(0,1,2,3)]
mesh = bpy.data.meshes.new('Pyramid_Mesh') #新建網(wǎng)格
mesh.from_pydata(verts, edges, faces) #載入網(wǎng)格數(shù)據(jù)
mesh.update() #更新網(wǎng)格數(shù)據(jù)
pyramid = bpy.data.objects.new('Pyramid', mesh) #新建物體“Pyramid”惶桐,并使用“mesh”網(wǎng)格數(shù)據(jù)
scene = bpy.context.scene
scene.objects.link(pyramid) #將物體鏈接至場(chǎng)景
打開Blender的文本編輯器窗口撮弧,按加號(hào)(+)新建一個(gè)文本,將上例中的代碼復(fù)制進(jìn)去姚糊,然后點(diǎn)擊標(biāo)題欄上的“運(yùn)行腳本(Run Script)”按鈕想虎,就得到下面的結(jié)果。
如果將載入網(wǎng)格數(shù)據(jù)代碼中的面數(shù)據(jù)改為空列表([]):
mesh.from_pydata(verts, edges, [])
再運(yùn)行腳本就可以在3D視圖窗口獲得下面的結(jié)果:
參考資料
學(xué)習(xí)bpy之前最好還是先學(xué)一下python叛拷,下面是一些參考資料:
[1] Python入門指南中文
[2] Python新手入門指南
[3] 小白的Python新手教程(感謝屯三友的推薦)
[4] Python for Kids
[5] 如何像python高手一樣編程
最后要說的是舌厨,這個(gè)菜鳥學(xué)bpy系列是我學(xué)些bpy過程中的筆記分享,預(yù)計(jì)每周一更忿薇。具體能寫多少裙椭,就得看我學(xué)習(xí)的進(jìn)度了。署浩。揉燃。