MRが楽しい

MRやVRについて学習したことを書き残す

Blender2.8で利用可能なpythonスクリプトを作る その4(オブジェクトの原点移動とサイズ調整)

本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。
bluebirdofoz.hatenablog.com

オブジェクトの原点変更

指定オブジェクトの原点位置を変更します。
オブジェクトの原点位置を変えるだけなので、オブジェクトそのものは移動しません。
・set_origin_cursor.py

# bpyインポート
import bpy
# copyインポート(参照型のコピーのため)
import copy

# オブジェクトの原点を指定位置に移動する
def set_origin_cursor(arg_objectname="Default", arg_location=(0, 0, 0)) -> bool:
    """オブジェクトの原点を指定位置に移動する
    
    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})
        arg_location {tuple} -- 移動先の指定座標 (default: {(0, 0, 0)})

    Returns:
        bool -- 実行の正否
    """
    
    # 他のオブジェクトの寸法を適用しないよう全てのオブジェクトを走査する
    for ob in bpy.context.scene.objects:
        # 非選択状態に設定する
        ob.select_set(False)

    # 指定オブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    selectob = bpy.data.objects.get(arg_objectname)

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False

    # 変更オブジェクトを選択状態にする  
    selectob.select_set(True)

    # 3Dカーソルの元の位置を記録しておく(参照型のコピー)
    cursorpos = copy.copy(bpy.context.scene.cursor.location)

    # 3Dカーソルの位置を指定位置に移動する
    bpy.context.scene.cursor.location = arg_location

    # オブジェクトの原点を3Dカーソル位置に移動する
    bpy.ops.object.origin_set(type='ORIGIN_CURSOR')

    # 3Dカーソルの位置を元に戻す
    bpy.context.scene.cursor.location = cursorpos

    return True

# 関数の実行例
set_origin_cursor(
    arg_objectname="Cube",
    arg_location=(2, 2, 2)
)

f:id:bluebirdofoz:20191228231214j:plain

オブジェクトのサイズ調整

指定オブジェクトのサイズを指定の長辺サイズに合うように拡縮します。

・change_object_dimensions.py

# bpyインポート
import bpy

# オブジェクトの寸法を指定のサイズ以内に変更する
def change_object_dimensions(arg_objectname="Default", arg_magnification=10) -> bool:
    """オブジェクトの寸法を指定のサイズ以内に変更する
    
    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})
        arg_magnification {int} -- 指定サイズ (default: {10})

    Returns:
        bool -- 実行の正否
    """

    # 指定オブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    selectob = bpy.data.objects.get(arg_objectname)

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False
    
    # 各辺の寸法を取得する
    selectdimX = selectob.dimensions[0]
    selectdimY = selectob.dimensions[1]
    selectdimZ = selectob.dimensions[2]

    # 最も大きい一辺を取得する
    selectdimMax = selectdimX
    if selectdimMax < selectdimY:
        selectdimMax = selectdimY
    if selectdimMax < selectdimZ:
        selectdimMax = selectdimZ
  
    # 最も大きい一辺を 10 にリサイズするための倍率を取得する
    magnification = arg_magnification / selectdimMax
  
    # 拡大後の寸法を取得します
    changedimX = selectdimX * magnification
    changedimY = selectdimY * magnification
    changedimZ = selectdimZ * magnification
    changedimensions = (changedimX,changedimY,changedimZ)
  
    # 寸法を変更する
    selectob.dimensions = changedimensions
  
    return True

# 関数の実行例
change_object_dimensions(
    arg_objectname="Cube",
    arg_magnification=10
)

f:id:bluebirdofoz:20191228231226j:plain