大人になりたくない

プログラミング系。最近は主に vvvv 。

Blender のアドオンを作る

Blender をステージエディタとして使いたいので、パラメータをいじるためにアドオンを作る必要があった。

検索すればたくさん出てくるので参考にして実装。

import bpy

bl_info = {
    "name":"AnimalRTS Addon",
    "description":"Addon for AnimalRTS",
    "category":"User"}
    
class AnimalRTSPanel(bpy.types.Panel):
    bl_label = "Animal RTS"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'TOOLS'

    def draw(self, context):
        layout = self.layout

        obj = context.object

        row = layout.row()
        row.label(text="Object = " + obj.name)
        row = layout.row()
        row.prop(obj, "canEnter", text="can enter")
        row = layout.row()
        row.prop(obj, "objType", text="type")

def register():
    bpy.types.Object.canEnter = bpy.props.BoolProperty()
    bpy.types.Object.objType = bpy.props.EnumProperty(name="objType",
                                            description="Object Type",
                                            default="None",
                                            items=[
                                            ('None','None','None'),
                                            ('HomeBase','HomeBase','HomeBase'),
                                            ('SubBase','SubBase','SubBase'),
                                            ('Bridge','Bridge','Bridge'),
                                            ])

    bpy.utils.register_class(AnimalRTSPanel)


def unregister():
    bpy.utils.unregister_class(AnimalRTSPanel)


if __name__ == "__main__":
    register()

とりあえずこんなメニューになる。

f:id:yhy:20130829230831p:plain

プロパティを追加するには、
bpy.props.BoolProperty
とか
bpy.props.EnumProperty
を使ってやれば良い。
(他のプロパティの参考:http://wiki.blender.org/index.php/Doc:2.6/Manual/Extensions/Python/Properties)

保存も自動でしてくれるようで便利。


で、てきとうに同じパスに書き出されるように、下みたいなのをてきとうな所に挿入。

def ExportAttributesFile(context, filepath):
    base, ext = os.path.splitext(filepath)
    f = open(base + '_attributes.txt', 'w')
    for obj in bpy.data.objects:
        f.write(obj.name + "," + str(obj.canEnter) + "," + str(obj.objType) + ",\n")
    
    f.close()
    return {'FINISHED'}


あと、とりあえずメッシュとレイの交差も実装したので、これで移動周りが書ける。

f:id:yhy:20130829231146p:plain,w200,h388
実機は GPU 速いけど、CPU は遅い感じなので気をつけよう。

LOD の指定とかもしたいんだけど、どういう風にしようかなー。