MRが楽しい

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

Blenderで利用可能なpythonスクリプトを作る その25(ノーマルマップや透過テクスチャを設定する)

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

マテリアルにノーマルマップを設定する

指定のマテリアルのテクスチャスロットに画像をノーマルマップとして設定する。
指定名のテクスチャスロットやテクスチャが既に存在する場合はそれを利用する。
ない場合は指定のファイルパスを元にテクスチャを新規作成する。
set_normalmap_texture.py

# bpyインポート
import bpy

# 指定されたマテリアルの指定のテクスチャスロットにノーマルマップを設定する
# 引数   arg_materialname:指定マテリアル名
#        arg_textureslotname:指定テクスチャスロット名
#        arg_applyfiledir:画像ファイルディレクトリ
#        arg_applyfilename:画像ファイル名
# 戻り値
def set_normalmap_texture(
  arg_materialname='Default',arg_textureslotname='Default',
  arg_applyfiledir='C:\\Blender\\PythonScriptTest\\NormalBaker\\Texture',
  arg_applyfilename='NormalMap.png'):

  # 指定マテリアルを取得する
  targetmat = bpy.data.materials[arg_materialname]
  # 指定テクスチャスロットを取得する
  targettextureslot = targetmat.texture_slots.get(arg_textureslotname)
  # 指定テクスチャスロットがない場合は新規作成する
  if targettextureslot == None:
    targettextureslot = targetmat.texture_slots.add()
  # 指定テクスチャスロットのテクスチャを取得する
  targettexture = targettextureslot.texture
  # 指定テクスチャスロットのテクスチャがない場合はテクスチャを設定する
  if targettexture == None:
    # 指定名のテクスチャを取得する
    targettexture = bpy.data.textures.get(arg_textureslotname)
    # 指定名のテクスチャがない場合はテクスチャを新規作成する
    if targettexture == None:
      # 新規テクスチャを作成する
      targettexture = bpy.data.textures.new(arg_textureslotname,type='IMAGE')
    # 作成したテクスチャスロットに新規テクスチャを設定する
    targettextureslot.texture = targettexture

  # 反映画像のファイルパスを取得する
  allpy_filepath = arg_applyfiledir + '\\' + arg_applyfilename
  # 反映画像を読み込み
  apply_image = bpy.data.images.load(filepath=allpy_filepath)
  # 作成した新規テクスチャに画像を設定する
  targettexture.image = apply_image

  # 全ての要素を一旦無効化する
  # ディフューズ要素を無効
  targettextureslot.use_map_diffuse = False
  targettextureslot.use_map_color_diffuse = False
  targettextureslot.use_map_alpha = False
  targettextureslot.use_map_translucency = False

  # シェーディング要素を無効
  targettextureslot.use_map_ambient = False
  targettextureslot.use_map_emit = False
  targettextureslot.use_map_mirror = False
  targettextureslot.use_map_raymir = False

  # スペキュラー要素を無効
  targettextureslot.use_map_specular = False
  targettextureslot.use_map_color_spec = False
  targettextureslot.use_map_hardness = False

  # ジオメトリ要素を無効
  targettextureslot.use_map_normal = False
  targettextureslot.use_map_warp = False
  targettextureslot.use_map_displacement = False

  # ジオメトリのノーマルのみ有効化
  targettextureslot.use_map_normal = True
  return


# 関数の実行例
set_normalmap_texture(
  arg_materialname='BakeToMaterial',arg_textureslotname='BakeNomal',
  arg_applyfiledir='D:\\WORK\\Texture',
  arg_applyfilename='BakeTexture.png')

f:id:bluebirdofoz:20190718090130j:plain

テクスチャの透過を有効化して透過オブジェクトを設定する

既にテクスチャを設定済みの指定のオブジェクトに透過設定を行う。
この際、テクスチャのアルファ(透過)情報を有効化する。
set_transparent_object.py

# bpyインポート
import bpy

# 対象のオブジェクトを透明化する
# 引数   arg_objectname:指定オブジェクト名
# 戻り値
def set_transparent_object(arg_objectname='Default'):
  # 対象オブジェクトを取得する
  selectob=bpy.context.scene.objects[arg_objectname]
  # オブジェクトの透過表示を有効化する
  selectob.show_transparent=True
  # マテリアルスロットが一つ以上あることを確認する
  if len(selectob.material_slots) > 0:
    # マテリアルスロットの一つ目のマテリアルを取得する
    targetmat=selectob.material_slots[0].material
    # マテリアルの透過を有効化する
    targetmat.use_transparency=True
    # 透過モードを「Z値透過」に設定する
    targetmat.transparency_method='Z_TRANSPARENCY'
    # アルファ値を 0.0 に設定する
    targetmat.alpha=0.0
    # テクスチャスロットが一つ以上あることを確認する
    if len(targetmat.texture_slots) > 0:
      # テクスチャスロットの一つ目のテクスチャのアルファ情報を有効化する
      targetmat.texture_slots[0].use_map_alpha=True
  return


# 関数の実行例
set_transparent_object('BakeTo')

f:id:bluebirdofoz:20190718090117j:plain