見出し画像

[Blender][スクリプト]サイドバーに「カメラ外枠透明度」「ロール」「左右反転」機能を追加する

以前の記事で3Dビューのメニューバーエリアに下記の様なUIを追加する記事を書きましたが、邪魔になったのでサイドパネルにまとめる事にしました。

上記をサイドバーの「ビュー」タブに移して、ついでにカメラの左右反転(スケールX*-1)機能もつけました。

これはどれもグリースペンシル用途です。絵を描く時にキャンパスを回転したり反転したりするのに使っています。
ロールがうまくいかない場合は"camera_rotation_z"を使っているカメラに合わせて変更してください。

import bpy
import math

def update_camera_rotation_z(self, context):
    camera = context.scene.camera
    if camera and camera.type == 'CAMERA':
        camera.rotation_euler[2] = math.radians(context.scene.camera_rotation_z)

def scale_camera_x_minus_one(self, context):
    camera = context.scene.camera
    if camera and camera.type == 'CAMERA':
        camera.scale.x *= -1

class CameraSettingsPanel(bpy.types.Panel):
    bl_label = "Camera Settings"
    bl_idname = "VIEW3D_PT_camera_settings"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'View'
    
    def draw(self, context):
        layout = self.layout
        camera = context.scene.camera
        if camera and camera.type == 'CAMERA':
            row = layout.row(align=True)
            sub = row.row(align=True)
            sub.scale_x = 0.9
            sub.prop(camera.data, "passepartout_alpha", text="CamOpacity", slider=True)
            
            row = layout.row(align=True)
            row.prop(context.scene, "camera_rotation_z", text="Roll", slider=True)
            
            row = layout.row()
            row.operator("object.scale_camera_x_minus_one", text="Flip")

class OBJECT_OT_scale_camera_x_minus_one(bpy.types.Operator):
    bl_idname = "object.scale_camera_x_minus_one"
    bl_label = "Scale Camera X -1"
    bl_options = {'REGISTER', 'UNDO'}

    def execute(self, context):
        scale_camera_x_minus_one(self, context)
        return {'FINISHED'}

def register():
    bpy.types.Scene.camera_rotation_z = bpy.props.FloatProperty(
        name="Camera Rotation Z",
        description="Adjust the Z rotation of the camera (Roll)",
        default=0.0,
        min=-180.0,
        max=180.0,
        step=1,
        update=update_camera_rotation_z
    )
    bpy.utils.register_class(CameraSettingsPanel)
    bpy.utils.register_class(OBJECT_OT_scale_camera_x_minus_one)

def unregister():
    bpy.utils.unregister_class(CameraSettingsPanel)
    bpy.utils.unregister_class(OBJECT_OT_scale_camera_x_minus_one)
    del bpy.types.Scene.camera_rotation_z

if __name__ == "__main__":
    register()

この記事が気に入ったらサポートをしてみませんか?