摘要:插件教程什么是插件插件只是一個(gè)帶有一些附加要求的模塊,因此可以在包含有用信息的列表中顯示它。安裝附加組件時(shí),將在控制臺(tái)中打印源和目標(biāo)路徑。現(xiàn)在嘗試將此腳本復(fù)制到并在默認(rèn)多維數(shù)據(jù)集上運(yùn)行它。
Blender插件教程
什么是插件?
插件只是一個(gè)帶有一些附加要求的Python模塊,因此Blender可以在包含有用信息的列表中顯示它。
舉個(gè)例子,這是最簡(jiǎn)單的插件:
bl_info = {"name": "My Test Add-on", "category": "Object"} def register(): print("Hello World") def unregister(): print("Goodbye World") bl_info
是一個(gè)包含附加元數(shù)據(jù)的字典,例如要在“用戶首選項(xiàng)”附加列表中顯示的標(biāo)題,版本和作者。
register
是一個(gè)僅在啟用加載項(xiàng)時(shí)運(yùn)行的函數(shù),這意味著可以在不激活加載項(xiàng)的情況下加載模塊。
unregister
是一個(gè)卸載任何設(shè)置的函數(shù)register,當(dāng)加載項(xiàng)被禁用時(shí)調(diào)用。
請(qǐng)注意,此附加組件不會(huì)執(zhí)行與Blender相關(guān)的任何操作(bpy例如,未導(dǎo)入模塊)。
這是一個(gè)附加組件的設(shè)計(jì)示例,用于說(shuō)明附加組件的基本要求很簡(jiǎn)單。
附加組件通常會(huì)注冊(cè)操作符,面板,菜單項(xiàng)等,但值得注意的是,當(dāng)從文本編輯器甚至交互式控制臺(tái)執(zhí)行時(shí),任何腳本都可以執(zhí)行此操作 - 附加組件沒有任何本質(zhì)上不同的內(nèi)容允許它與Blender集成,這些功能只是由bpy模塊提供,可供任何腳本訪問(wèn)。
因此,附加組件只是以用戶可以輕松利用的方式封裝Python模塊的一種方式。
注意
在文本編輯器中運(yùn)行此腳本將不會(huì)打印任何內(nèi)容,以查看必須通過(guò)“用戶首選項(xiàng)”安裝的輸出。啟用和禁用時(shí)將打印消息。
你的第一個(gè)加載項(xiàng)上面最簡(jiǎn)單的附加組件作為示例很有用,但不是很多。下一個(gè)附加組件很簡(jiǎn)單,但展示了如何使用一個(gè)腳本將腳本集成到Blender中,Operator 這是定義從菜單,按鈕和鍵盤快捷鍵訪問(wèn)的工具的典型方法。
對(duì)于第一個(gè)示例,我們將創(chuàng)建一個(gè)簡(jiǎn)單地移動(dòng)場(chǎng)景中所有對(duì)象的腳本。
寫劇本將以下腳本添加到Blender中的文本編輯器:
import bpy
scene = bpy.context.scene
for obj in scene.objects:
obj.location.x += 1.0
單擊“ 運(yùn)行腳本”按鈕,活動(dòng)場(chǎng)景中的所有對(duì)象都將由1.0 Blender單元移動(dòng)。
寫加載項(xiàng)(簡(jiǎn)單)此附加組件使用上面腳本的主體,并將其添加到操作員的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 分為多行,這只是一種用于更輕松添加項(xiàng)目的樣式約定。
注意
bpy.context.scene我們使用context.scene傳遞給的參數(shù)而不是使用execute()。在大多數(shù)情況下,這些都是相同的。但是在某些情況下,運(yùn)算符將被傳遞給自定義上下文,因此腳本作者應(yīng)該更喜歡context傳遞給運(yùn)算符的參數(shù)。
要測(cè)試腳本,您可以將其復(fù)制并粘貼到Blender的文本編輯器中并運(yùn)行它。這將直接執(zhí)行腳本并立即調(diào)用寄存器。
但是,運(yùn)行腳本不會(huì)移動(dòng)任何對(duì)象。為此,您需要執(zhí)行新注冊(cè)的運(yùn)算符。
../../_images/advanced_scripting_addon-tutorial_operator-search-menu.png
操作員搜索菜單。
通過(guò)按下Spacebar以調(diào)出操作員搜索菜單并輸入“Move X by One”(the bl_label),然后執(zhí)行此操作Return。
對(duì)象應(yīng)該像以前一樣移動(dòng)。
在Blender中打開此附加組件以進(jìn)行下一步 - 安裝。
安裝附加組件在Blender的文本編輯器中添加了加載項(xiàng)之后,您將希望能夠安裝它,以便可以在用戶首選項(xiàng)中啟用它以在啟動(dòng)時(shí)加載。
即使上面的附加組件是一個(gè)測(cè)試,但是我們?nèi)匀灰瓿蛇@些步驟,以便您知道如何在以后執(zhí)行此操作。
要將Blender文本作為加載項(xiàng)安裝,首先必須將其保存到磁盤。請(qǐng)注意遵守適用于Python模塊的命名限制,并以.py擴(kuò)展名結(jié)束。
一旦文件在磁盤上,您就可以像在線下載的加載項(xiàng)一樣安裝它。
打開用戶文件?用戶首選項(xiàng),選擇加載項(xiàng)選項(xiàng)卡,按安裝加載項(xiàng)...并選擇文件。
現(xiàn)在將列出加載項(xiàng),您可以通過(guò)按復(fù)選框啟用加載項(xiàng),如果要在重新啟動(dòng)時(shí)啟用加載項(xiàng),請(qǐng)按“ 另存為默認(rèn)值”。
注意
附加組件的目標(biāo)取決于您的Blender配置。安裝附加組件時(shí),將在控制臺(tái)中打印源和目標(biāo)路徑。您還可以通過(guò)在Python控制臺(tái)中運(yùn)行此命令來(lái)查找加載項(xiàng)路徑位置。
import addon_utils
print(addon_utils.paths())
這里有關(guān)于此主題的更多內(nèi)容: 目錄布局。
對(duì)于我們的第二個(gè)附加組件,我們將專注于對(duì)象實(shí)例化 - 這是 - 以與您可能在數(shù)組修飾符中看到的方式類似的方式創(chuàng)建對(duì)象的鏈接副本。
寫劇本和以前一樣,首先我們將從腳本開始,開發(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ù)集上運(yùn)行它。確保在運(yùn)行之前單擊以移動(dòng)3D光標(biāo),因?yàn)楦北緦⒊霈F(xiàn)在光標(biāo)的位置。
運(yùn)行后,請(qǐng)注意當(dāng)您進(jìn)入編輯模式以更改多維數(shù)據(jù)集時(shí) - 所有副本都會(huì)更改。在Blender中,這稱為L(zhǎng)inked Duplicates。
接下來(lái),我們將在循環(huán)中執(zhí)行此操作,以在活動(dòng)對(duì)象和游標(biāo)之間創(chuàng)建對(duì)象數(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))
嘗試使用活動(dòng)對(duì)象運(yùn)行此腳本,并將光標(biāo)間隔開以查看結(jié)果。
使用這個(gè)腳本,您會(huì)注意到我們正在使用對(duì)象位置和光標(biāo)進(jìn)行一些數(shù)學(xué)計(jì)算,這是有效的,因?yàn)樗鼈兌际?D 實(shí)例,模塊提供了一個(gè)方便的類,它允許向量乘以數(shù)字和矩陣。mathutils. Vectormathutils
如果您對(duì)這個(gè)領(lǐng)域感興趣,請(qǐng)閱讀mathutils.Vector - 有許多方便的實(shí)用功能,例如獲取矢量,交叉積,點(diǎn)積之間的角度以及mathutils.geometry Bézier樣條插值和光線三角交叉等更高級(jí)的函數(shù)。
目前我們將專注于使這個(gè)腳本成為一個(gè)附加組件,但很高興知道這個(gè)3D數(shù)學(xué)模塊可用,并可以在以后幫助您使用更高級(jí)的功能。
寫加載項(xiàng)第一步是將腳本按原樣轉(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)容都已在前面的步驟中介紹過(guò),您可能還想嘗試運(yùn)行附加組件,并考慮可以采取哪些措施使其更有用。
兩個(gè)最明顯的缺失是 - 總固定為10,并且不得不從太空桿訪問(wèn)操作員不是很方便。
接下來(lái)將解釋這些添加內(nèi)容,然后是最終腳本。
運(yùn)算符屬性有許多屬性類型用于工具設(shè)置,常見的屬性類型包括:int,float,vector,color,boolean和string。
這些屬性的處理方式與典型的Python類屬性不同,因?yàn)锽lender需要在界面中顯示它們,將它們的設(shè)置存儲(chǔ)在鍵映射中并保留設(shè)置以便重用。
雖然這是以相當(dāng)Pythonic的方式處理的,但請(qǐng)注意,您實(shí)際上定義的是加載到Blender中的工具設(shè)置,并且在Python之外由Blender的其他部分訪問(wèn)。
為了擺脫文字10 total,我們將使用運(yùn)算符屬性。運(yùn)算符屬性是通過(guò)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在注冊(cè)類時(shí)專門處理,因此它們?cè)谟脩艚缑嬷酗@示為按鈕。您可以將許多參數(shù)傳遞給屬性以設(shè)置限制,更改默認(rèn)值并顯示工具提示。
也可以看看
bpy.props.IntProperty
本文檔不會(huì)詳細(xì)介紹如何使用其他屬性類型。但是,上面的鏈接包含更高級(jí)的屬性使用示例。
菜單項(xiàng)附加組件可以添加到Python中定義的現(xiàn)有面板,標(biāo)題和菜單的用戶界面。
對(duì)于此示例,我們將添加到現(xiàn)有菜單。
../../_images/advanced_scripting_addon-tutorial_menu-id.png
菜單標(biāo)識(shí)符。
要查找菜單的標(biāo)識(shí)符,可以將鼠標(biāo)懸停在菜單項(xiàng)上,并顯示標(biāo)識(shí)符。
用于添加菜單項(xiàng)的方法是將繪圖函數(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)擴(kuò)展菜單的文檔,請(qǐng)參閱:菜單(bpy_struct)。
鍵圖在Blender中,附加組件有自己的鍵盤映射,以免干擾Blender的內(nèi)置鍵映射。
在下面的示例中,bpy.types.KeyMap添加了一個(gè)新的對(duì)象模式,然后將a bpy.types.KeyMapItem添加到引用我們新添加的運(yùn)算符的鍵映射中,使用它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()
請(qǐng)注意,鍵盤映射項(xiàng)的total設(shè)置不同于操作員設(shè)置的默認(rèn)設(shè)置,這允許您使用不同設(shè)置訪問(wèn)同一運(yùn)算符的多個(gè)鍵。
注意
雖然Shift-Ctrl-Spacebar不是默認(rèn)的Blender鍵快捷鍵,但很難確保加載項(xiàng)不會(huì)覆蓋彼此的鍵盤圖,至少在分配鍵時(shí)不要與Blender中的重要功能沖突。
有關(guān)上面列出的函數(shù)的API文檔,請(qǐng)參閱:
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
在菜單中。
運(yùn)行腳本(或保存它并通過(guò)之前的用戶首選項(xiàng)添加它),它將出現(xiàn)在菜單中。
../../_images/advanced_scripting_addon-tutorial_op-prop.png
運(yùn)營(yíng)商財(cái)產(chǎn)。
從菜單中選擇它后,您可以選擇要?jiǎng)?chuàng)建的多維數(shù)據(jù)集的實(shí)例數(shù)。
注意
多次直接執(zhí)行腳本也會(huì)每次添加菜單。雖然沒有用處,但沒有什么可擔(dān)心的,因?yàn)楫?dāng)通過(guò)用戶首選項(xiàng)啟用時(shí),加載項(xiàng)不會(huì)多次注冊(cè)。
結(jié)論附加組件可以巧妙地封裝某些功能,以便編寫工具來(lái)改進(jìn)工作流程或編寫實(shí)用程序以供其他人使用。
雖然Python在Blender中可以做的事情有限,但是在不必深入研究Blender的C / C ++代碼的情況下肯定可以實(shí)現(xiàn)很多。
本教程中給出的示例是有限的,但顯示了用于常見任務(wù)的Blender API,您可以將其擴(kuò)展為編寫自己的工具。
進(jìn)一步閱讀
Blender帶有注釋模板,可以從文本編輯器的標(biāo)題中訪問(wèn)。如果您想要查看示例代碼的特定區(qū)域,這是一個(gè)很好的起點(diǎn)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42155.html
摘要:在交互式控制臺(tái)中運(yùn)行此操作時(shí),您將看到視口更新。鍵入或粘貼到交互式控制臺(tái)中。用戶首選項(xiàng)加載項(xiàng)列表使用顯示有關(guān)每個(gè)加載項(xiàng)的信息。最后兩行僅用于測(cè)試這允許腳本直接在文本編輯器中運(yùn)行以測(cè)試更改。 Blender Python API概述 本文檔的目的是解釋Python和Blender如何組合在一起,涵蓋了一些在閱讀API參考和示例腳本時(shí)可能不明顯的功能。 Python in Blender ...
摘要:次時(shí)代傳統(tǒng)的方式就是創(chuàng)建次時(shí)代模型,對(duì)應(yīng)中的材質(zhì)是高光網(wǎng)格材質(zhì)對(duì)象,通常貼圖文件包含顏色貼圖法線貼圖和高光貼圖。 產(chǎn)品在線展示案例預(yù)覽 玉鐲在線預(yù)覽:http://www.yanhuangxueyuan.co... 汽車在線預(yù)覽:http://www.yanhuangxueyuan.co... Web3D技術(shù)歷史 可通過(guò)插件或WebGL技術(shù)實(shí)現(xiàn)Web3D,在線網(wǎng)頁(yè)上預(yù)覽操作三維...
摘要:在控制臺(tái)中輸入路徑。因此,下一步是通過(guò)參考文件檢查訪問(wèn)畫筆的位置。上下文畫筆紋理對(duì)比度由于每個(gè)屬性都是按照我們?cè)诳刂婆_(tái)中組成數(shù)據(jù)路徑的方式給出的可以有多種方式來(lái)訪問(wèn)相同的數(shù)據(jù),您選擇的方法通常取決于任務(wù)。 Blender參考API用法 Blender有許多互連數(shù)據(jù)類型,它們具有自動(dòng)生成的引用api,它通常具有編寫腳本所需的信息,但可能難以使用。 本文檔旨在幫助您了解如何使用參考API。...
摘要:為了讓數(shù)值計(jì)算的結(jié)果能夠有更好的渲染效果,這段時(shí)間一直在用這個(gè)開源軟件來(lái)處理計(jì)算結(jié)果。 為了讓數(shù)值計(jì)算的結(jié)果能夠有更好的渲染效果,這段時(shí)間一直在用Blender這個(gè)開源軟件來(lái)處理計(jì)算結(jié)果。 因?yàn)槭翘幚泶罅繑?shù)據(jù)的計(jì)算結(jié)果,所以不得不考慮用Python編寫腳本來(lái)實(shí)現(xiàn)批量處理,編寫過(guò)程中,Google幫我解決了大部分實(shí)現(xiàn)過(guò)程中的障礙,下面是完整的實(shí)現(xiàn)過(guò)程: 將計(jì)算結(jié)果的mesh文件導(dǎo)入到...
閱讀 2689·2023-04-25 20:28
閱讀 1876·2021-11-22 09:34
閱讀 3706·2021-09-26 10:20
閱讀 1863·2021-09-22 16:05
閱讀 3099·2021-09-09 09:32
閱讀 2533·2021-08-31 09:40
閱讀 2117·2019-08-30 13:56
閱讀 3330·2019-08-29 17:01