【Blender】いつも手作業していた処理をPythonスクリプトで書いて楽をしよう~ランダムUV coordinate編~
和風家具って格子が多いから機械的にUV割り当あてると木目が同じになっちゃって違和感がある。UV coordinatesをランダムにすべきだということでPythonスクリプト作ってみる。やっぱ違和感減るわね
アドオン無いっぽいけど、UVランダムって需要ないのか?
例えばですね、最近、古民家向けにこういう置物を作ったんですけど、中央の縦の図形を複製配列(Array)で作ったんですが、UVが全部おなじになってしまって激烈にダサいわけです。かと言ってUVを1本1本手で移動とかやってられないですし。
やってみよう
Blender 2.92です。2.7以前の方は変数名が異なるので注意してください。[uv_textures]が2.7までしか使えなくて、2.8以降は[uv_layers]に変わっています。一応どっちも動くソースを用意しています。
1.スクリプトウインドウレイアウトにしてみる
スクリプトを使うときはScriptingビューのレイアウトにすると便利です。
How to texture random UV coordinate using scripting python.
・2.9
・2.7
2.スクリプトを実行
まず、オブジェクトモードにして、ランダムUVを実行したいメッシュを選択してください。
スクリプトビューにこのコードを貼り付けてみます。下側の黒い画面です。
import bpy import copy from random import random mesh = bpy.context.object.data bpy.ops.object.mode_set(mode = 'EDIT') bpy.ops.mesh.select_mode(type="VERT") bpy.ops.mesh.select_all(action = 'SELECT') #blender 2.8x later uvtex = bpy.ops.mesh.uv_texture_add() bpy.context.object.data.uv_layers[len(mesh.uv_layers) - 1].name = "UVRandom" bpy.context.object.data.uv_layers["UVRandom"].active_render = True mesh.uv_layers.active = mesh.uv_layers[len(mesh.uv_layers) - 1] #選択 #blender 2.7x #uvtex = mesh.uv_textures.new('UVRandom') #UVマップ生成 #bpy.context.object.data.uv_textures["UVRandom"].active_render = True #mesh.uv_textures.active = mesh.uv_textures[len(mesh.uv_textures) - 1] #選択 bpy.ops.uv.smart_project(stretch_to_bounds=False) #スマートUVを適用 location_list = [] uv_list = [] uv_list.clear() location_list.clear() obj = bpy.context.active_object for v in obj.data.vertices: vec = copy.copy(v.co) vec.x = random() vec.y = random() vec.z = random() location_list.append(vec) uv_list = [p[:2] for p in location_list] import bmesh mesh = obj.data bm = bmesh.from_edit_mesh(mesh) uv_layer = bm.loops.layers.uv.active for bm_face in bm.faces: id = bm_face.loops[0].vert.index print(id) for v in bm_face.loops: v[uv_layer].uv[0] = v[uv_layer].uv[0] + uv_list[id][0] v[uv_layer].uv[1] = v[uv_layer].uv[1] + uv_list[id][1] bmesh.update_edit_mesh(mesh) bpy.ops.object.editmode_toggle()
すると、こんな風にUVがランダムになります。雰囲気がぜんぜん変わりますね。
仕掛けとしては、UVビューで、選択レベル=面に変えて、ランダム値を加算して移動してやろうってことです。加算するので全体的に右上に寄ります。
ヒント
Blenderってログに全コマンドが実は表示されていたんですね。そのため「あの操作って何てプログラムすればいいのか分からない」て思ったらログを出した状態で手操作すればOK。
2021/3/29追記
普通はノードエディタで対処するようです。
Randomize UV coordinates for wood planks? – BlenderArtists
参考サイト
・How can I set UVs to a Mesh in Blender Python? – Stackoverflow
・Randomize UV coordinates for wood planks? – BlenderArtists
・UVLoopLayers(bpy_struct) – Blender 2.92.0 Python API