この記事の概要
私はBlenderを使って3DCGの練習をしています。
3DCGってモデリングに目が行きがちですが、ライティングも大事で、その中でも3灯照明は王道のセッティングなのでだいたい毎回使用しています。
そんな中、毎回繰り返し作業が発生していたのでPythonで効率化できる気がして記事にしました。
もしかしたら役立つかもしれないけど、正直そこまで期待はできない。くらいの内容です。
3灯照明とは
あえて私が説明するまでもなく、世の中に分かりやすい記事がたくさん上がっているので詳細な説明はそちらにお任せします。
今回効率化できる気がしたのが、設定が以下のように意外とシステマチックにできるからです。
それぞれの角度が90度ずつくらい違って3灯を配置するので、計算で出せそうだなと思いました。
もちろん実際には見え方を考慮して少しずつズラしますし、ここまで単純な話ではありません。
ただ、雛形を一発で作れるだけでも便利なのではないか?という仮説です。
実行
Blender上でPythonを動かす方法は他の方が詳しく記事を書かれているので、そちらをどうぞ。
今回の一旦の完成形は以下です。
import bpy
current = bpy.context.view_layer.objects.active #1
key_light = bpy.data.objects[current.name] #1
target_name = 'Target_Empty' #2
empty = bpy.data.objects.new(name=target_name, object_data=None) #2
bpy.context.collection.objects.link(empty) #2
key_light.select_set(True) #1
bpy.ops.object.constraint_add(type='TRACK_TO')
bpy.context.object.constraints['Track To'].target = bpy.data.objects[target_name] #2
x = key_light.location.x
y = key_light.location.y
z = key_light.location.z
bpy.ops.object.duplicate_move(TRANSFORM_OT_translate={'value':(-2*x, -2*y, z)}) #3
bpy.ops.object.duplicate_move(TRANSFORM_OT_translate={'value':(x-y, x+y, -1.5*z)}) #3
迷い迷い書いたのでもっと良くできるのかもしれませんが、ポイントになりそうな箇所をピックアップします。
1. key_lightの取得とselect_set
最初はLightを選択しておけばいいのですが、後からEmptyを操作する都合でselectが奪われます。
そのため、あらかじめLightを取得しておいて後から再度選択状態を取り戻しました。
これができなくて、Lightを複製したいのにEmptyが複製されてずっと困っていました。
2. 名前付きEmptyの作成とTrack to対象への設定
素直な方法であろうbpy.ops.object.empty_add()
だと、生成される要素の名前がEmpty
です。
それはそれで良いのですが、既に場に同名の要素があった場合はEmpty.001
になります。
というわけでユニークな名前を指定しておいた方が楽そうだなと思ってこのようにしました。
偉そうに言っていますがここを見ただけです。
3. 座標を頑張って計算する
90度回転と180度回転なので、xとyの加減だけで出せます。
ちなみにzもだいたいいつもこんな感じで高さをいじるので、ついでに設定しました。
最後に
挙動としてはこのようになります。
一応目論見通りの動きにはなりました。
まったく同じことをしたい人は少ないと思いますが、この手の「半ばプリセット化している」ような作業へのアプローチとしては使えるかもしれません。
最後まで読んでくださってありがとうございます!
Twitterでも情報を発信しているので、良かったらフォローお願いします!
Devトークでのお話してくださる方も募集中です!