MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その10(法線の再計算)

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

法線の再計算を実行

指定オブジェクトに法線の再計算を実行します。
法線の再計算は閉じられたメッシュの外側に法線を向けます。
正しく法線を設定する場合は、重複頂点の結合や面の穴埋めを予め実施する必要があります。
・normal_make_consistent.py

# bpyインポート
import bpy

# オブジェクトに法線の再計算を実行する
def normal_make_consistent(arg_objectname="Default") -> bool:
    """[summary]
    
    Keyword Arguments:
        arg_objectname {str} -- 指定オブジェクト名 (default: {'Default'})

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

    # 他のオブジェクトに操作を適用しないよう全てのオブジェクトを走査する
    for ob in bpy.context.scene.objects:
        # 非選択状態に設定する
        ob.select_set(False)

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

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

    # 変更オブジェクトをアクティブに変更する
    bpy.context.view_layer.objects.active = targetob

    # 編集モードに移行する
    bpy.ops.object.mode_set(mode='EDIT', toggle=False)

    # 頂点を全選択した状態とする
    bpy.ops.mesh.select_all(action='SELECT')

    # 面と頂点の法線をメッシュの外側(inside=False)に向ける
    bpy.ops.mesh.normals_make_consistent(inside=False)

    # オブジェクトモードに移行する
    bpy.ops.object.mode_set(mode='OBJECT', toggle=False)

    return True

# 関数の実行例
normal_make_consistent("Sphere")

f:id:bluebirdofoz:20200104215912j:plain

前回記事のクリーンアップ操作の関数を組み合わせると、これらの操作を一括で実行できます。
bluebirdofoz.hatenablog.com