1
/
5

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

Unsplashから画像を選択

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

〜環境〜 blender 3.0 python 3.9.7

目次 [非表示]

  • Pythonを書く前に
  • 視点をカメラにする
    ▼コードの解説❶パネルを追加
    ▼❷パネルのレイアウト
    ▼「視点をカメラにする」ボタンを追加
    ▼「視点をカメラにする」機能を追加
  • おわりに

Pythonを書く前に

Blender内でPythonを書くことができます。 ① blenderを開き、ヘッダーメニュー(緑の枠)のScriptingをクリックします。


② 赤枠の部分の「 + 新規」をクリックすると記述できます。 赤枠の部分にコード書いていきます。

視点をカメラにする

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

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

ところで・・・・・

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

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


フロントエンドエンジニア
即戦力募集!最新技術を追い求めるフロントエンドエンジニアをWanted!
ロジカルスタジオは、テクノロジーとデザインの視点からクライアントの課題解決をめざす、大阪のクリエイティブプロダクションです。 クライアントの期待を超えて「もっと良くなる、を見つける」のが私たちのスタイル。企画・提案からデザイン制作・システム構築、運用、改善提案をワンストップで行えるのが一番の強みです。近年ではその実績と品質が評価され、案件も急増しています。 代表の古川が掲げる企業理念は「絆を大切に、周りの人を豊かにし、社会に貢献する」。 私たちはこのミッションを推進するため、「新しい技術へのチャレンジ精神」を軸に、「切磋琢磨する仲間」と「働きやすい職場環境」を整え、「成長と可能性を大切にする風土」を育ててきました。 2019年9月に増床し、外部向けのセミナーにも活用できるカンファレンスルームを拡充。スタッフによる公式ブログや、マスコットキャラクター「ロージー&カール」によるTwitterなど、情報発信も強化しています。 可能性の芽をすくい上げられるこの場所を、より大きくしていきたい。 私たちと一緒に、このビジョンを実現しませんか。
株式会社ロジカルスタジオ
Invitation from 株式会社ロジカルスタジオ
If this story triggered your interest, have a chat with the team?
株式会社ロジカルスタジオ's job postings
2 Likes
2 Likes

Weekly ranking

Show other rankings
Like カトリーヌ's Story
Let カトリーヌ's company know you're interested in their content