【blender】Pythonで現視点をカメラにするボタン追加してみた

フロントエンド
エンジニア

カトリーヌ

ごきげんよう。入社して1年が経ちました。
カトリーヌです。

フロントエンド
エンジニア

カトリーヌ

今年の目標は、三麻で役満することを胸に生きています。

前回と引き続きblender記事を書こうと思います。 Blenderを初めてから約6年くらい経ちますが、 毎日コツコツ触っていたわけでなく、短期間の一点集中で制作していたので 時期が開いたりして忘れちゃうんですよね・・・・ショートカットキーを。 毎度メモを見るか調べてやってましたが、そろそろどうにかしたい 特に「視点をカメラにする」ショートカットキー(CTRL + ALT + テンキー0) 何回も使うので、ボタン押しただけで切り替えるようにしたい!!!! と編集画面をカスタマイズできないかと調べたところ なんとBlenderにはPythonが使えるという!6年越しの新発見です!! ということで、Pythonで視点をカメラにするボタン作りました!

〜環境〜 blender 3.0 python 3.9.7

Pythonを書く前に

Blender内でPythonを書くことができます。 ① blenderを開き、ヘッダーメニュー(緑の枠)のScriptingをクリックします。 blenderのPythonでカスタマイズ ② 赤枠の部分の「 + 新規」をクリックすると記述できます。 赤枠の部分にコード書いていきます。

視点をカメラにする

完成したコードはこちらです。


import bpy
  
# 視点をカメラにするボタン
class Camera_viewpoint_Panel(bpy.types.Panel):
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'カメラ'
    bl_label = 'カメラ'
    
    def draw(self, context):
       layout = self.layout
       row = layout.row()
       row.operator('camera.add')
class Camera_viewpoint_btn(bpy.types.Operator):
   bl_idname = 'camera.add'
   bl_label = '視点をカメラにする'
   bl_description = '視点をカメラにする'
   
   
   def execute(self,context):
       bpy.ops.object.select_all(action='DESELECT')
       for obj in bpy.data.objects:
           if obj.type == 'CAMERA':
               if "Camera" in obj.name:
                   obj.select_set(True)
                   bpy.data.objects.remove(obj)
       
       camera_data = bpy.data.cameras.new(name="Camera")
       if camera_data is None:
           return {"CANCELLED"}
       my_camera = bpy.data.objects.new("Camera", camera_data)
       if my_camera is None:
           return {"CANCELLED"}
       
       bpy.context.scene.collection.objects.link(my_camera)
       context.scene.camera = my_camera
       bpy.ops.view3d.camera_to_view()
       
   
       return{'FINISHED'}
       
bpy.utils.register_class(Camera_viewpoint_Panel)
bpy.utils.register_class(Camera_viewpoint_btn)

コードの解説

❶パネルを追加

class Camera_viewpoint_Panel(bpy.types.Panel): bl_space_type :パネルを追加する場所 今回は3D viewportを指すVIEW_3Dに設定します。 bl_region_type :パネルが所属する領域 bl_space_typeで指定した中に存在する領域を指定する必要があります。 指定できるものは以下です!

‘WINDOW’, ‘HEADER’, ‘CHANNELS’, ‘TEMPORARY’, ‘UI’, ‘TOOLS’, ‘TOOL_PROPS’, ‘PREVIEW’, ‘HUD’, ‘NAVIGATION_BAR’, ‘EXECUTE’, ‘FOOTER’, ‘TOOL_HEADER’

🤔なぜか、指定できないものもあるのでエラーでたらダメなんだくらいで色々試してみてください🤔 今回はよく使ってるUIにパネルをボタンを追加していきます。 bl_category :サイドバーのタブに追加 既にあるものを指定した場合は、その中にボタンが追加されます。 bl_space_type :追加したパネルのタイトル

❷パネルのレイアウト

def draw(self, context):
layout = self.layout
row = layout.row()
row.operator(‘camera.add’)

以下の記事でレイアウトの種類を分かりやすく紹介しています! https://bookyakuno.com/python-layout-menu/ 完成したパネルはこちら

「視点をカメラにする」ボタンを追加

class Camera_viewpoint_btn(bpy.types.Operator):
bl_idname = ‘camera.add’
bl_label = ‘視点をカメラにする’
bl_description = ‘視点をカメラにする’

bl_idname:追加したい場所を指定 今回は、row.operatorの camea.addを指定します。 bl_label:ボタンの名前 bl_idname:ボタンの説明

「視点をカメラにする」機能を追加

def execute(self,context):
bpy.ops.object.select_all(action=’DESELECT’)
for obj in bpy.data.objects:
if obj.type == ‘CAMERA’:
if “Camera” in obj.name:
obj.select_set(True)
bpy.data.objects.remove(obj)

camera_data = bpy.data.cameras.new(name=”Camera”)
if camera_data is None:
return {“CANCELLED”}
my_camera = bpy.data.objects.new(“Camera”, camera_data)
if my_camera is None:
return {“CANCELLED”}

bpy.context.scene.collection.objects.link(my_camera)
context.scene.camera = my_camera
bpy.ops.view3d.camera_to_view()

bpy.ops.view3d.camera_to_view():カメラ視点に切り替える これだけだと、ただカメラ視点に切り替えるのみで現在の視点は反映されてません。 ここから、現視点をカメラに適用していきます。 他にも方法はありますが、 今回はカメラを現視点の位置で新規に作成して切り替えるように実装しました。 ※もっとスマートなやり方はあるかもです・・・・・

#シーンに新規でカメラを追加する

def execute(self,context):
bpy.ops.object.select_all(action=’DESELECT’)
for obj in bpy.data.objects:
if obj.type == ‘CAMERA’:
if “Camera” in obj.name:
obj.select_set(True)
bpy.data.objects.remove(obj)

camera_data = bpy.data.cameras.new(name=”Camera”)
if camera_data is None:
return {“CANCELLED”}
my_camera = bpy.data.objects.new(“Camera”, camera_data)
if my_camera is None:
return {“CANCELLED”}

bpy.context.scene.collection.objects.link(my_camera)
context.scene.camera = my_camera
bpy.ops.view3d.camera_to_view()

ただ、これだけだと大量にカメラが爆誕してしまうので 下記の記述で選択されているカメラは削除で一個のみになるようにしています。

オブジェクトタイプが”CAMERA”で名前に”Camera”が含まれていれば削除

bpy.ops.object.select_all(action=’DESELECT’)
for obj in bpy.data.objects:
if obj.type == ‘CAMERA’:
if “Camera” in obj.name:
obj.select_set(True)
bpy.data.objects.remove(obj)

完成されたのがコチラになります!!!

「視点をカメラにする」ボタンを押すとカメラが適用されています。

おわりに

初!blenderでpythonというこで 日本語での解説が少なく英語サイトを翻訳したりしてかなり苦戦しましたが 組み合わせ次第で、カスタマイズが可能なので面白かったです。 今回はカメラのみの実装ですが もう少し使いやすく調整・他の機能も追加して blenderのUIをさらにわかりやすく・使いやすくするものを いつかアドオンにして公開できたらなと思います。

検索で何度も(CTRL + ALT + テンキー0)と出会いました・・ 途中でやっぱりショートカットキー覚えた方が早かったのではと思ったのは内緒でお願いします。

参考サイト:Blender 3.1 Python API Documentation

ところで・・・・・

ロジカルスタジオではフロントエンジニア、バックエンドエンジニアを募集しています。

今回の記事が役に立つかも・・・・・・

ご興味のある方は是非採用サイトからご応募ください!