以下の内容はhttps://kafkafinancialgroup.hatenablog.com/entry/2025/05/20/011127より取得しました。


UnderwearPropsの解説: Blenderアドオン開発の基本要素

Blenderアドオン開発の基本要素

Blenderアドオン「ミニマル下着生成」の基本的な要素について、一つ一つ詳しく解説します。

PropertyGroup(プロパティグループ)

class UnderwearProps(bpy.types.PropertyGroup):
    base_body: bpy.props.PointerProperty(
        name="素体",
        type=bpy.types.Object,
        description="下着を生成する素体"
    )

解説

  • PropertyGroupはプロパティの集合を定義するクラスです
  • bpy.props.PointerPropertyは他のオブジェクトへの参照を作成します
  • この場合、素体として使用するメッシュオブジェクトを指定するためのものです
  • nameはUIに表示される名前、descriptionツールチップに表示される説明、typeは参照先のデータ型です

パネル(Panel)

class UNDERWEAR_PT_Main(bpy.types.Panel):
    bl_label = "ミニマル下着生成"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    bl_category = "下着"

解説

  • PanelBlenderのUIを拡張するためのクラスです
  • bl_label:パネルのヘッダーに表示されるタイトル
  • bl_space_type:パネルを表示する画面領域(3Dビュー)
  • bl_region_type:パネルを表示する画面の部分(サイドバー)
  • bl_category:サイドバーのタブ名

drawメソッド

def draw(self, context):
    props = context.scene.underwear_props
    layout = self.layout
    layout.prop_search(props, "base_body", bpy.data, "objects", text="素体")
    layout.operator("underwear.generate", text="パンツ生成")
  • drawメソッドはパネルの内容を描画します
  • prop_searchはオブジェクト選択用のドロップダウンUIを作成
  • operatorはボタンを配置し、クリック時に指定のオペレーターを呼び出します

メッシュ生成ロジック

def create_pants_mesh(base_obj):
    # 頂点グループ「hip」検索
    vg = None
    for group in base_obj.vertex_groups:
        if "hip" in group.name.lower() or "腰" in group.name:
            vg = group
            break

解説

  • 素体の頂点グループから「hip」または「腰」という名前を含むグループを探しています
  • 3Dモデルでは通常、体の部位ごとに頂点グループが作成されており、それを利用します

bmeshの利用

bm = bmesh.new()
bm.from_mesh(mesh)
deform = bm.verts.layers.deform.verify()
  • bmeshBlenderの高度なメッシュ編集ライブラリです
  • bm.verts.layers.deformは頂点グループのウェイト情報にアクセスします

頂点の選択と削除

selected = [v for v in bm.verts if vg.index in v[deform] and v[deform][vg.index] > 0.5]
remove = [v for v in bm.verts if v not in selected]
bmesh.ops.delete(bm, geom=remove, context='VERTS')
  • hip頂点グループのウェイトが0.5以上の頂点だけを残し、それ以外を削除
  • bmesh.ops.deleteは選択した頂点を削除する操作です

マテリアル生成

def create_lavender_material():
    mat = bpy.data.materials.new("Lavender_Trans")
    mat.use_nodes = True
    mat.blend_method = 'BLEND'

解説

  • 新しいマテリアルを作成し、ノードベースのマテリアルに設定
  • blend_method = 'BLEND'は半透明レンダリングモードを設定

マテリアルノードの設定

bsdf.inputs["Base Color"].default_value = (0.7, 0.5, 1.0, 1.0)
bsdf.inputs["Alpha"].default_value = 0.4
  • Base Colorでマテリアルの色(ラベンダー色)を設定
  • Alphaで透明度を設定(0.4 = 60%不透明)

オペレーター(Operator)

class UNDERWEAR_OT_Generate(bpy.types.Operator):
    bl_idname = "underwear.generate"
    bl_label = "パンツ生成"

解説

  • Operatorはボタンクリックなどで実行される処理を定義します
  • bl_idnameはオペレーターの一意の識別子(名前空間.操作名)
  • bl_labelはUIに表示される名前

executeメソッド

def execute(self, context):
    props = context.scene.underwear_props
    base_obj = props.base_body
    if not base_obj or base_obj.type != 'MESH':
        self.report({'ERROR'}, "有効な素体を選択してください")
        return {'CANCELLED'}
  • executeメソッドはオペレーターの主処理を行います
  • 入力チェックを行い、エラーの場合は早期に終了します
  • 成功時は{'FINISHED'}、エラー時は{'CANCELLED'}を返します

登録・解除処理

classes = [UnderwearProps, UNDERWEAR_PT_Main, UNDERWEAR_OT_Generate]
def register():
    for c in classes: bpy.utils.register_class(c)
    bpy.types.Scene.underwear_props = bpy.props.PointerProperty(type=UnderwearProps)
def unregister():
    for c in reversed(classes): bpy.utils.unregister_class(c)
    del bpy.types.Scene.underwear_props

解説

  • register関数はアドオン有効化時に実行されます
  • 作成したクラスをBlenderに登録する処理を行います
  • シーンにプロパティを追加する処理も行います

  • unregister関数はアドオン無効化時に実行されます

  • 登録したクラスを逆順に削除します
  • 追加したシーンのプロパティも削除します

補足:重要なポイント

  1. クラス登録の順序:依存関係のあるクラスは、依存先より先に登録する必要があります
  2. プロパティの追加と削除:登録時にプロパティを追加し、解除時に削除することで、アドオンの有効化/無効化をクリーンに行えます
  3. エラーハンドリング:ユーザー操作によるエラーを適切に処理し、フィードバックを返すことで使いやすさが向上します
  4. メッシュ編集の手順:bmeshを使ったメッシュ操作は「作成→編集→適用→解放」という流れを守ることが重要です

これらの基本を理解することで、さらに複雑なBlenderアドオンも開発できるようになります。

Citations: [1] https://pplx-res.cloudinary.com/image/private/user_uploads/52522745/a2636f69-43f3-4648-8e75-79d36cf3af4e/image.jpg [2] https://fereria.github.io/reincarnation_tech_bk/05_DCCTool/10_Blender/10_Scripts/05_add_props/ [3] https://docs.blender.org/api/current/bpy.types.PropertyGroup.html [4] http://blenderscript.ni-moe.com/blenderscript/prop_search%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9 [5] https://blender.stackexchange.com/questions/260235/blender-python-addon-doesnt-unregister-registers-fine [6] https://www.youtube.com/watch?v=sF-iTbQYd0E [7] https://docs.blender.org/api/current/bpy.types.Panel.html [8] https://docs.blender.org/api/2.78/bpy.types.Operator.html [9] https://note.com/gentle_lupine925/n/nffc88b2aa731 [10] https://docs.blender.org/api/current/bpy.types.ShaderNodeBsdfPrincipled.html [11] https://docs.blender.org/api/current/bpy.types.PointerProperty.html [12] https://zenn.dev/nikogoli/scraps/6dd7ae9ea6ad4f [13] https://blenderartists.org/t/proper-way-to-unregister-a-tool/1348559 [14] https://bookyakuno.com/property-default-to-user-setting/ [15] https://note.com/kageji/n/ncbacc5428a55 [16] https://dskjal.com/blender/how-to-use-property.html [17] https://devtalk.blender.org/t/unregister-an-operator-in-the-menu-bugg/13077 [18] https://site-builder.wiki/posts/44212 [19] https://stackoverflow.com/questions/34464872/unregister-and-remove-addon-in-blender-with-python-does-not-remove-the-item-from [20] https://colorful-pico.net/introduction-to-addon-development-in-blender/2.7/html/chapter_03/01_Handle_Mouse_Click_Event.html [21] https://blenderartists.org/t/propertygroup-unregister-error/1410748 [22] https://docs.blender.org/api/3.2/bpy.types.PropertyGroup.html [23] https://devtalk.blender.org/t/prop-search-with-activate-init/28887 [24] https://gist.github.com/JacquesLucke/11fecc6ea86ef36ea72f76ca547e795b [25] https://www.youtube.com/watch?v=Lw52iBbNTYM [26] https://qiita.com/SaitoTsutomu/items/22d20d88495fbd604529 [27] https://bookyakuno.com/blender-addon-making-tutorial/ [28] https://logical-studio.com/develop/backend/python/20220408-blender-python/ [29] https://vook.vc/n/6079 [30] https://blenderartists.org/t/why-do-many-operators-execute-external-functions/1403456 [31] https://www.miraiportal.com/subdivide/ [32] https://help.altair.com/hwdesktop/hwx/topics/pre_processing/geometry/surfaces_drag_unity_t.htm [33] https://ydlprog.ddns.net/2024/09/14/blender-addon%E9%96%8B%E7%99%BA%E3%81%AE%E4%B8%8B%E6%BA%96%E5%82%99/ [34] https://www.youtube.com/watch?v=Y67eCfiqJQU [35] https://saas.n-works.link/programming/python/what_is_blender_python [36] https://www.youtube.com/watch?v=kB_PN46K99U [37] https://gihyo.jp/article/2023/01/blender-basics-02 [38] https://blenderartists.org/t/bpy-types-pointerproperty-fpr-view-layer/1446387 [39] https://yuni-wiki.com/blender/how_to_get_location_of_object_data/ [40] https://qiita.com/hibit/items/d8a84152a729b356f1fb [41] https://qiita.com/SaitoTsutomu/items/6b8e6e734c99be6eeb5e [42] https://www.youtube.com/watch?v=5m0hdzU_vY8 [43] https://colorful-pico.net/introduction-to-addon-development-in-blender/2.8/html/chapter_02/07_Control_Blender_UI.html [44] https://www.youtube.com/watch?v=3Sj4vgx5gQs [45] https://zenn.dev/panda_nakami/articles/20220405-blender-python-operator-property [46] https://site-builder.wiki/posts/56260 [47] https://yumeno.me/blender-script [48] https://note.com/s_t877/n/n2c184c048c75 [49] https://gist.github.com/dskjal/4d8c9276041937dcadf9059785400c70 [50] https://colorful-pico.net/introduction-to-addon-development-in-blender/2.7/html/chapter_02/08_Control_Blender_UI_1.html [51] https://zenn.dev/jim_soros/articles/8429c4b2a91b76 [52] https://note.com/tori_142/n/nf985f98766c0 [53] https://fereria.github.io/reincarnation_tech_bk/en/05_DCCTool/10_Blender/10_Scripts/04_operator/ [54] https://kutodatabase.com/kuto1970.shop/Works_BPYNyumon.html [55] https://colorful-pico.net/introduction-to-addon-development-in-blender/2.8/html/chapter_02/01_Basic_Of_Add-on_Development.html [56] https://zenn.dev/hotcocoa/articles/5c5ab06c40862b [57] https://colorful-pico.net/introduction-to-addon-development-in-blender/2.8/html/chapter_02/02_Register_Multiple_Operators.html [58] https://b3d.interplanety.org/en/executing-operators-with-parameters/ [59] https://note.com/koaro_11/n/n956624d233e8 [60] https://manabu.quu.cc/up/misc/blender/script/Src01blender.html [61] https://docs.blender.org/api/current/bmesh.ops.html [62] https://zenryokuservice.com/wp/2021/09/04/blender-python-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%80%9Cpython%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7/ [63] https://sinestesia.co/blog/tutorials/extruding-meshes-with-bmesh/ [64] https://unolaboratory.com/blender-python-editmode/ [65] https://functionbay.com/documentation/onlinehelp/Documents/extrudemanualmesh.htm [66] https://qiita.com/nutti/items/a836391723bd28cd3e4c [67] https://fereria.github.io/reincarnation_tech_bk/05_DCCTool/10_Blender/10_Scripts/03_vscode_addon_dev/ [68] https://unolaboratory.com/blender-python-add-ons/ [69] https://zenn.dev/wasabind/articles/7e3c0afc537171 [70] https://www.youtube.com/watch?v=HnrInoBWT6Q [71] https://bevyskein.dev/docs/blender-addon-structure [72] https://docs.blender.org/api/2.83/bpy.types.ShaderNodeBsdfPrincipled.html [73] https://zenn.dev/yuni50314/books/blender_python_api_ver41/viewer/set_default_shader_node [74] https://qiita.com/SaitoTsutomu/items/f95fcc7b58f22b872bcf [75] https://manabu.quu.cc/up/misc/blender/beditsub.html [76] https://note.com/a_si/n/n9286f4db2625 [77] https://note.com/zztakuya/n/nd0e4f6d29727 [78] https://cad-kenkyujo.com/blender-node/ [79] https://note.com/replicorn/n/nb3af35480070 [80] https://gihyo.jp/article/2023/10/blender-basics-21 [81] https://docs.blender.org/manual/ja/latest/editors/properties_editor.html [82] https://blender.stackexchange.com/questions/6975/is-it-possible-to-use-bpy-props-pointerproperty-to-store-a-pointer-to-an-object [83] https://udemy.benesse.co.jp/design/3d/blender-modeling.html [84] https://blenderartists.org/t/custom-ui-pulldown-of-pointerproperty/1382023 [85] https://blog.csdn.net/qq_43331089/article/details/125795980 [86] https://fereria.github.io/reincarnation_tech_bk/05_DCCTool/10_Blender/10_Scripts/01_dataacess/ [87] https://docs.blender.org/manual/ja/latest/advanced/operators.html [88] https://colorful-pico.net/wp/blender%E5%86%85%E9%83%A8%E6%A7%8B%E9%80%A01-%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%BF/ [89] http://matosus304.blog106.fc2.com/blog-entry-257.html


Perplexity の Eliot より: pplx.ai/share




以上の内容はhttps://kafkafinancialgroup.hatenablog.com/entry/2025/05/20/011127より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14