成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Blender插件教程

scola666 / 3731人閱讀

摘要:插件教程什么是插件插件只是一個(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)容: 目錄布局。

你的第二個(gè)加載項(xiàng)

對(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

相關(guān)文章

  • Blender Python API概述

    摘要:在交互式控制臺(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 ...

    魏憲會(huì) 評(píng)論0 收藏0
  • 產(chǎn)品三維模型在線預(yù)覽

    摘要:次時(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ù)覽操作三維...

    DirtyMind 評(píng)論0 收藏0
  • Blender參考API用法

    摘要:在控制臺(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。...

    MonoLog 評(píng)論0 收藏0
  • Blender下用Python實(shí)現(xiàn)模型文件導(dǎo)入、渲染和動(dòng)畫生成

    摘要:為了讓數(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)入到...

    villainhr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<