【Blender】いつも手作業していた処理をPythonスクリプトで書いて楽をしよう~ランダムUV coordinate編~

Pocket
LinkedIn にシェア
LINEで送る

和風家具って格子が多いから機械的に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()

・2.9

・2.7

すると、こんな風に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

記事の情報はお役に立ちましたか?

ご支援も承っています。
ご注意:返金のご対応はいたしかねます。あくまでも投げ銭としての位置付けであり、優待・特典等はございません。ご了承下さい。

17713:【Blender】いつも手作業していた処理をPythonスクリプトで書いて楽をしよう~ランダムUV coordinate編~

v3

管理人が読んだおすすめの建築本

    

コメントを残す