摘要:插件教程什么是插件插件只是一個帶有一些附加要求的模塊,因此可以在包含有用信息的列表中顯示它。安裝附加組件時,將在控制臺中打印源和目標(biāo)路徑。現(xiàn)在嘗試將此腳本復(fù)制到并在默認(rèn)多維數(shù)據(jù)集上運行它。
Blender插件教程
什么是插件?
插件只是一個帶有一些附加要求的Python模塊,因此Blender可以在包含有用信息的列表中顯示它。
舉個例子,這是最簡單的插件:
bl_info = {"name": "My Test Add-on", "category": "Object"} def register(): print("Hello World") def unregister(): print("Goodbye World") bl_info
是一個包含附加元數(shù)據(jù)的字典,例如要在“用戶首選項”附加列表中顯示的標(biāo)題,版本和作者。
register
是一個僅在啟用加載項時運行的函數(shù),這意味著可以在不激活加載項的情況下加載模塊。
unregister
是一個卸載任何設(shè)置的函數(shù)register,當(dāng)加載項被禁用時調(diào)用。
請注意,此附加組件不會執(zhí)行與Blender相關(guān)的任何操作(bpy例如,未導(dǎo)入模塊)。
這是一個附加組件的設(shè)計示例,用于說明附加組件的基本要求很簡單。
附加組件通常會注冊操作符,面板,菜單項等,但值得注意的是,當(dāng)從文本編輯器甚至交互式控制臺執(zhí)行時,任何腳本都可以執(zhí)行此操作 - 附加組件沒有任何本質(zhì)上不同的內(nèi)容允許它與Blender集成,這些功能只是由bpy模塊提供,可供任何腳本訪問。
因此,附加組件只是以用戶可以輕松利用的方式封裝Python模塊的一種方式。
注意
在文本編輯器中運行此腳本將不會打印任何內(nèi)容,以查看必須通過“用戶首選項”安裝的輸出。啟用和禁用時將打印消息。
你的第一個加載項上面最簡單的附加組件作為示例很有用,但不是很多。下一個附加組件很簡單,但展示了如何使用一個腳本將腳本集成到Blender中,Operator 這是定義從菜單,按鈕和鍵盤快捷鍵訪問的工具的典型方法。
對于第一個示例,我們將創(chuàng)建一個簡單地移動場景中所有對象的腳本。
寫劇本將以下腳本添加到Blender中的文本編輯器:
import bpy
scene = bpy.context.scene
for obj in scene.objects:
obj.location.x += 1.0
單擊“ 運行腳本”按鈕,活動場景中的所有對象都將由1.0 Blender單元移動。
寫加載項(簡單)此附加組件使用上面腳本的主體,并將其添加到操作員的execute()功能中。
bl_info = { "name": "Move X Axis", "category": "Object", } import bpy class ObjectMoveX(bpy.types.Operator): """My Object Moving Script""" # Use this as a tooltip for menu items and buttons. bl_idname = "object.move_x" # Unique identifier for buttons and menu items to reference. bl_label = "Move X by One" # Display name in the interface. bl_options = {"REGISTER", "UNDO"} # Enable undo for the operator. def execute(self, context): # execute() is called when running the operator. # The original script scene = context.scene for obj in scene.objects: obj.location.x += 1.0 return {"FINISHED"} # Lets Blender know the operator finished successfully. def register(): bpy.utils.register_class(ObjectMoveX) def unregister(): bpy.utils.unregister_class(ObjectMoveX) # This allows you to run the script directly from Blender"s Text editor # to test the add-on without having to install it. if __name__ == "__main__": register()
注意
bl_info 分為多行,這只是一種用于更輕松添加項目的樣式約定。
注意
bpy.context.scene我們使用context.scene傳遞給的參數(shù)而不是使用execute()。在大多數(shù)情況下,這些都是相同的。但是在某些情況下,運算符將被傳遞給自定義上下文,因此腳本作者應(yīng)該更喜歡context傳遞給運算符的參數(shù)。
要測試腳本,您可以將其復(fù)制并粘貼到Blender的文本編輯器中并運行它。這將直接執(zhí)行腳本并立即調(diào)用寄存器。
但是,運行腳本不會移動任何對象。為此,您需要執(zhí)行新注冊的運算符。
../../_images/advanced_scripting_addon-tutorial_operator-search-menu.png
操作員搜索菜單。
通過按下Spacebar以調(diào)出操作員搜索菜單并輸入“Move X by One”(the bl_label),然后執(zhí)行此操作Return。
對象應(yīng)該像以前一樣移動。
在Blender中打開此附加組件以進行下一步 - 安裝。
安裝附加組件在Blender的文本編輯器中添加了加載項之后,您將希望能夠安裝它,以便可以在用戶首選項中啟用它以在啟動時加載。
即使上面的附加組件是一個測試,但是我們?nèi)匀灰瓿蛇@些步驟,以便您知道如何在以后執(zhí)行此操作。
要將Blender文本作為加載項安裝,首先必須將其保存到磁盤。請注意遵守適用于Python模塊的命名限制,并以.py擴展名結(jié)束。
一旦文件在磁盤上,您就可以像在線下載的加載項一樣安裝它。
打開用戶文件?用戶首選項,選擇加載項選項卡,按安裝加載項...并選擇文件。
現(xiàn)在將列出加載項,您可以通過按復(fù)選框啟用加載項,如果要在重新啟動時啟用加載項,請按“ 另存為默認(rèn)值”。
注意
附加組件的目標(biāo)取決于您的Blender配置。安裝附加組件時,將在控制臺中打印源和目標(biāo)路徑。您還可以通過在Python控制臺中運行此命令來查找加載項路徑位置。
import addon_utils
print(addon_utils.paths())
這里有關(guān)于此主題的更多內(nèi)容: 目錄布局。
對于我們的第二個附加組件,我們將專注于對象實例化 - 這是 - 以與您可能在數(shù)組修飾符中看到的方式類似的方式創(chuàng)建對象的鏈接副本。
寫劇本和以前一樣,首先我們將從腳本開始,開發(fā)它,然后將其轉(zhuǎn)換為附加組件。
import bpy from bpy import context # Get the current scene scene = context.scene # Get the 3D cursor cursor = scene.cursor_location # Get the active object (assume we have one) obj = scene.objects.active # Now make a copy of the object obj_new = obj.copy() # The object won"t automatically get into a new scene scene.objects.link(obj_new) # Now we can place the object obj_new.location = cursor
現(xiàn)在嘗試將此腳本復(fù)制到Blender并在默認(rèn)多維數(shù)據(jù)集上運行它。確保在運行之前單擊以移動3D光標(biāo),因為副本將出現(xiàn)在光標(biāo)的位置。
運行后,請注意當(dāng)您進入編輯模式以更改多維數(shù)據(jù)集時 - 所有副本都會更改。在Blender中,這稱為Linked Duplicates。
接下來,我們將在循環(huán)中執(zhí)行此操作,以在活動對象和游標(biāo)之間創(chuàng)建對象數(shù)組。
import bpy from bpy import context scene = context.scene cursor = scene.cursor_location obj = scene.objects.active # Use a fixed value for now, eventually make this user adjustable total = 10 # Add "total" objects into the scene for i in range(total): obj_new = obj.copy() scene.objects.link(obj_new) # Now place the object in between the cursor # and the active object based on "i" factor = i / total obj_new.location = (obj.location * factor) + (cursor * (1.0 - factor))
嘗試使用活動對象運行此腳本,并將光標(biāo)間隔開以查看結(jié)果。
使用這個腳本,您會注意到我們正在使用對象位置和光標(biāo)進行一些數(shù)學(xué)計算,這是有效的,因為它們都是3D 實例,模塊提供了一個方便的類,它允許向量乘以數(shù)字和矩陣。mathutils. Vectormathutils
如果您對這個領(lǐng)域感興趣,請閱讀mathutils.Vector - 有許多方便的實用功能,例如獲取矢量,交叉積,點積之間的角度以及mathutils.geometry Bézier樣條插值和光線三角交叉等更高級的函數(shù)。
目前我們將專注于使這個腳本成為一個附加組件,但很高興知道這個3D數(shù)學(xué)模塊可用,并可以在以后幫助您使用更高級的功能。
寫加載項第一步是將腳本按原樣轉(zhuǎn)換為附加組件:
bl_info = { "name": "Cursor Array", "category": "Object", } import bpy class ObjectCursorArray(bpy.types.Operator): """Object Cursor Array""" bl_idname = "object.cursor_array" bl_label = "Cursor Array" bl_options = {"REGISTER", "UNDO"} def execute(self, context): scene = context.scene cursor = scene.cursor_location obj = scene.objects.active total = 10 for i in range(total): obj_new = obj.copy() scene.objects.link(obj_new) factor = i / total obj_new.location = (obj.location * factor) + (cursor * (1.0 - factor)) return {"FINISHED"} def register(): bpy.utils.register_class(ObjectCursorArray) def unregister(): bpy.utils.unregister_class(ObjectCursorArray) if __name__ == "__main__": register()
這里的所有內(nèi)容都已在前面的步驟中介紹過,您可能還想嘗試運行附加組件,并考慮可以采取哪些措施使其更有用。
兩個最明顯的缺失是 - 總固定為10,并且不得不從太空桿訪問操作員不是很方便。
接下來將解釋這些添加內(nèi)容,然后是最終腳本。
運算符屬性有許多屬性類型用于工具設(shè)置,常見的屬性類型包括:int,float,vector,color,boolean和string。
這些屬性的處理方式與典型的Python類屬性不同,因為Blender需要在界面中顯示它們,將它們的設(shè)置存儲在鍵映射中并保留設(shè)置以便重用。
雖然這是以相當(dāng)Pythonic的方式處理的,但請注意,您實際上定義的是加載到Blender中的工具設(shè)置,并且在Python之外由Blender的其他部分訪問。
為了擺脫文字10 total,我們將使用運算符屬性。運算符屬性是通過bpy.props模塊定義的,它被添加到類主體中:
# moved assignment from execute() to the body of the class... total = bpy.props.IntProperty(name="Steps", default=2, min=1, max=100) # and this is accessed on the class # instance within the execute() function as... self.total
這些屬性bpy.props由Blender在注冊類時專門處理,因此它們在用戶界面中顯示為按鈕。您可以將許多參數(shù)傳遞給屬性以設(shè)置限制,更改默認(rèn)值并顯示工具提示。
也可以看看
bpy.props.IntProperty
本文檔不會詳細(xì)介紹如何使用其他屬性類型。但是,上面的鏈接包含更高級的屬性使用示例。
菜單項附加組件可以添加到Python中定義的現(xiàn)有面板,標(biāo)題和菜單的用戶界面。
對于此示例,我們將添加到現(xiàn)有菜單。
../../_images/advanced_scripting_addon-tutorial_menu-id.png
菜單標(biāo)識符。
要查找菜單的標(biāo)識符,可以將鼠標(biāo)懸停在菜單項上,并顯示標(biāo)識符。
用于添加菜單項的方法是將繪圖函數(shù)附加到現(xiàn)有類中:
def menu_func(self, context):
self.layout.operator(ObjectCursorArray.bl_idname)
def register():
bpy.types.VIEW3D_MT_object.append(menu_func)
有關(guān)擴展菜單的文檔,請參閱:菜單(bpy_struct)。
鍵圖在Blender中,附加組件有自己的鍵盤映射,以免干擾Blender的內(nèi)置鍵映射。
在下面的示例中,bpy.types.KeyMap添加了一個新的對象模式,然后將a bpy.types.KeyMapItem添加到引用我們新添加的運算符的鍵映射中,使用它Shift-Ctrl-Spacebar作為激活它的鍵快捷鍵。
# store keymaps here to access after registration addon_keymaps = [] def register(): # handle the keymap wm = bpy.context.window_manager km = wm.keyconfigs.addon.keymaps.new(name="Object Mode", space_type="EMPTY") kmi = km.keymap_items.new(ObjectCursorArray.bl_idname, "SPACE", "PRESS", ctrl=True, shift=True) kmi.properties.total = 4 addon_keymaps.append((km, kmi)) def unregister(): # handle the keymap for km, kmi in addon_keymaps: km.keymap_items.remove(kmi) addon_keymaps.clear()
請注意,鍵盤映射項的total設(shè)置不同于操作員設(shè)置的默認(rèn)設(shè)置,這允許您使用不同設(shè)置訪問同一運算符的多個鍵。
注意
雖然Shift-Ctrl-Spacebar不是默認(rèn)的Blender鍵快捷鍵,但很難確保加載項不會覆蓋彼此的鍵盤圖,至少在分配鍵時不要與Blender中的重要功能沖突。
有關(guān)上面列出的函數(shù)的API文檔,請參閱:
bpy.types.KeyMaps.new,
bpy.types.KeyMap,
bpy.types.KeyMapItems.new,
bpy.types.KeyMapItem。
把它們一起
bl_info = { "name": "Cursor Array", "category": "Object", } import bpy class ObjectCursorArray(bpy.types.Operator): """Object Cursor Array""" bl_idname = "object.cursor_array" bl_label = "Cursor Array" bl_options = {"REGISTER", "UNDO"} total = bpy.props.IntProperty(name="Steps", default=2, min=1, max=100) def execute(self, context): scene = context.scene cursor = scene.cursor_location obj = scene.objects.active for i in range(self.total): obj_new = obj.copy() scene.objects.link(obj_new) factor = i / self.total obj_new.location = (obj.location * factor) + (cursor * (1.0 - factor)) return {"FINISHED"} def menu_func(self, context): self.layout.operator(ObjectCursorArray.bl_idname) # store keymaps here to access after registration addon_keymaps = [] def register(): bpy.utils.register_class(ObjectCursorArray) bpy.types.VIEW3D_MT_object.append(menu_func) # handle the keymap wm = bpy.context.window_manager # Note that in background mode (no GUI available), keyconfigs are not available either, # so we have to check this to avoid nasty errors in background case. kc = wm.keyconfigs.addon if kc: km = wm.keyconfigs.addon.keymaps.new(name="Object Mode", space_type="EMPTY") kmi = km.keymap_items.new(ObjectCursorArray.bl_idname, "SPACE", "PRESS", ctrl=True, shift=True) kmi.properties.total = 4 addon_keymaps.append((km, kmi)) def unregister(): # Note: when unregistering, it"s usually good practice to do it in reverse order you registered. # Can avoid strange issues like keymap still referring to operators already unregistered... # handle the keymap for km, kmi in addon_keymaps: km.keymap_items.remove(kmi) addon_keymaps.clear() bpy.utils.unregister_class(ObjectCursorArray) bpy.types.VIEW3D_MT_object.remove(menu_func) if __name__ == "__main__": register() ../../_images/advanced_scripting_addon-tutorial_in-menu.png
在菜單中。
運行腳本(或保存它并通過之前的用戶首選項添加它),它將出現(xiàn)在菜單中。
../../_images/advanced_scripting_addon-tutorial_op-prop.png
運營商財產(chǎn)。
從菜單中選擇它后,您可以選擇要創(chuàng)建的多維數(shù)據(jù)集的實例數(shù)。
注意
多次直接執(zhí)行腳本也會每次添加菜單。雖然沒有用處,但沒有什么可擔(dān)心的,因為當(dāng)通過用戶首選項啟用時,加載項不會多次注冊。
結(jié)論附加組件可以巧妙地封裝某些功能,以便編寫工具來改進工作流程或編寫實用程序以供其他人使用。
雖然Python在Blender中可以做的事情有限,但是在不必深入研究Blender的C / C ++代碼的情況下肯定可以實現(xiàn)很多。
本教程中給出的示例是有限的,但顯示了用于常見任務(wù)的Blender API,您可以將其擴展為編寫自己的工具。
進一步閱讀
Blender帶有注釋模板,可以從文本編輯器的標(biāo)題中訪問。如果您想要查看示例代碼的特定區(qū)域,這是一個很好的起點
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42155.html
摘要:在交互式控制臺中運行此操作時,您將看到視口更新。鍵入或粘貼到交互式控制臺中。用戶首選項加載項列表使用顯示有關(guān)每個加載項的信息。最后兩行僅用于測試這允許腳本直接在文本編輯器中運行以測試更改。 Blender Python API概述 本文檔的目的是解釋Python和Blender如何組合在一起,涵蓋了一些在閱讀API參考和示例腳本時可能不明顯的功能。 Python in Blender ...
摘要:次時代傳統(tǒng)的方式就是創(chuàng)建次時代模型,對應(yīng)中的材質(zhì)是高光網(wǎng)格材質(zhì)對象,通常貼圖文件包含顏色貼圖法線貼圖和高光貼圖。 產(chǎn)品在線展示案例預(yù)覽 玉鐲在線預(yù)覽:http://www.yanhuangxueyuan.co... 汽車在線預(yù)覽:http://www.yanhuangxueyuan.co... Web3D技術(shù)歷史 可通過插件或WebGL技術(shù)實現(xiàn)Web3D,在線網(wǎng)頁上預(yù)覽操作三維...
摘要:在控制臺中輸入路徑。因此,下一步是通過參考文件檢查訪問畫筆的位置。上下文畫筆紋理對比度由于每個屬性都是按照我們在控制臺中組成數(shù)據(jù)路徑的方式給出的可以有多種方式來訪問相同的數(shù)據(jù),您選擇的方法通常取決于任務(wù)。 Blender參考API用法 Blender有許多互連數(shù)據(jù)類型,它們具有自動生成的引用api,它通常具有編寫腳本所需的信息,但可能難以使用。 本文檔旨在幫助您了解如何使用參考API。...
摘要:為了讓數(shù)值計算的結(jié)果能夠有更好的渲染效果,這段時間一直在用這個開源軟件來處理計算結(jié)果。 為了讓數(shù)值計算的結(jié)果能夠有更好的渲染效果,這段時間一直在用Blender這個開源軟件來處理計算結(jié)果。 因為是處理大量數(shù)據(jù)的計算結(jié)果,所以不得不考慮用Python編寫腳本來實現(xiàn)批量處理,編寫過程中,Google幫我解決了大部分實現(xiàn)過程中的障礙,下面是完整的實現(xiàn)過程: 將計算結(jié)果的mesh文件導(dǎo)入到...
閱讀 2679·2023-04-25 20:28
閱讀 1849·2021-11-22 09:34
閱讀 3687·2021-09-26 10:20
閱讀 1834·2021-09-22 16:05
閱讀 3085·2021-09-09 09:32
閱讀 2502·2021-08-31 09:40
閱讀 2099·2019-08-30 13:56
閱讀 3320·2019-08-29 17:01