【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




