MENU
現在旧サイトから移行中です。内容に抜けがありますが 鋭意調整中です。

Local View(/)時にカメラが動かないようにするアドオン

BlenderのLocal View(/)は押すと選択しているオブジェクトにフォーカスズームされます。
MayaのIsolate selectのようにしたかったですが、デフォルトで設定を変更できなかったので、pyを作成しました。
デフォルトの機能の上書きではなく、別のものとしてインストるされます。
(視点位置・ズーム・向き・レンズは元のまま維持)
※こちらのpyの利用に関連して利用者に発生した損害について、当社は一切責任を負いません。

bl_info = {
    "name": "Toggle Local View (No Zoom)",
    "author": "ChatGPT",
    "version": (1, 2, 0),
    "blender": (3, 0, 0),
    "location": "3D View",
    "description": "Toggle Local View without changing view zoom/position (works in all modes)",
    "category": "3D View",
}

import bpy


class VIEW3D_OT_localview_nozoom(bpy.types.Operator):
    """Toggle Local View without changing zoom/position"""
    bl_idname = "view3d.localview_nozoom"
    bl_label = "Toggle Local View (No Zoom)"
    bl_options = {'REGISTER', 'UNDO'}

    @classmethod
    def poll(cls, context):
        return (
            context.area is not None
            and context.area.type == 'VIEW_3D'
            and context.space_data is not None
            and context.region_data is not None
        )

    def execute(self, context):
        rv3d = context.region_data
        space = context.space_data

        # 現在のビュー情報を保存
        prev_location = rv3d.view_location.copy()
        prev_distance = rv3d.view_distance
        prev_rotation = rv3d.view_rotation.copy()
        prev_perspective = rv3d.view_perspective
        prev_lens = space.lens

        # Local View をトグル(frame_selected=False でフレームさせない)
        try:
            result = bpy.ops.view3d.localview(frame_selected=False)
        except RuntimeError:
            return {'CANCELLED'}

        if 'CANCELLED' in result:
            return {'CANCELLED'}

        # ビュー情報を復元
        rv3d.view_location = prev_location
        rv3d.view_distance = prev_distance
        rv3d.view_rotation = prev_rotation
        rv3d.view_perspective = prev_perspective
        space.lens = prev_lens

        return {'FINISHED'}


# ---- Keymap(各モードのキーマップにも登録する) ----

addon_keymaps = []


def _add_km_items(kc, km_name, space_type='VIEW_3D'):
    km = kc.keymaps.new(name=km_name, space_type=space_type)

    kmi = km.keymap_items.new(
        idname="view3d.localview_nozoom",
        type='NUMPAD_SLASH',
        value='PRESS'
    )
    addon_keymaps.append((km, kmi))

    kmi2 = km.keymap_items.new(
        idname="view3d.localview_nozoom",
        type='SLASH',
        value='PRESS'
    )
    addon_keymaps.append((km, kmi2))


def register_keymap():
    wm = bpy.context.window_manager
    kc = wm.keyconfigs.addon
    if not kc:
        return

    # 3D View 系(基本)
    _add_km_items(kc, "3D View", 'VIEW_3D')
    _add_km_items(kc, "3D View Generic", 'VIEW_3D')

    # Edit / Sculpt / Pose など主要モード用(Blender の標準キーマップ名)
    for km_name in [
        "Mesh",
        "Curve",
        "Armature",
        "Metaball",
        "Lattice",
        "Pose",
        "Sculpt",
        "Weight Paint",
        "Vertex Paint",
        "Texture Paint",
        "Grease Pencil",
    ]:
        try:
            _add_km_items(kc, km_name, 'VIEW_3D')
        except Exception:
            # 環境によって存在しないキーマップ名があっても落ちないように
            pass


def unregister_keymap():
    wm = bpy.context.window_manager
    kc = wm.keyconfigs.addon
    if not kc:
        return

    for km, kmi in addon_keymaps:
        try:
            km.keymap_items.remove(kmi)
        except Exception:
            pass
    addon_keymaps.clear()


def register():
    bpy.utils.register_class(VIEW3D_OT_localview_nozoom)
    register_keymap()


def unregister():
    unregister_keymap()
    bpy.utils.unregister_class(VIEW3D_OT_localview_nozoom)


if __name__ == "__main__":
    register()
目次

使い方

  • このコードをテキストにコピーし local_view_no_zoom.py などの名前で保存
  • Blender → Edit → Preferences → Add-ons → Install… で読み込み
  • アドオンにチェックを入れて有効化(必要であればショートカット設定)
  • 3Dビューで テンキー / か キーボード / を押す
よかったらシェアしてね
  • URLをコピーしました!
  • URLをコピーしました!
目次