blender-uv-texturing について
画像テクスチャやアトラスを 3D モデルに適合させる Blender スキルです。UV マッピング、マテリアル設定、ベイク、検証を扱い、テンプレート駆動のアセットに対応します。
主な機能
- 01ビュー投影 UV マッピング
- 02パーツごとのアトラス割り当て
- 03PBR テクスチャと色空間の設定
- 04アルファデカールの設定
- 05ベイクターゲットの設定
- 06UV とエクスポートの検証
活用シーン
- 01アトラスをモデルの各パーツに適用
- 02ラフネス、法線、ライトマップの設定
- 03黒い背景板のないアルファデカールの構成
- 04GLB エクスポート前の UV カバレッジ確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ roble3/ cc-blender-skill --skill blender-uv-texturingインストール後、Claude Code で/blender-uv-texturingを入力して読み込まれたか確認します。
同梱ファイルevals/evals.jsonreferences/overview.md
詳細
Blender UV テクスチャリング
このスキルは、「マテリアルを割り当てる」だけでは「提供されたテクスチャパックが実際にモデルに合う」状態にならないという問題を解決します。テンプレート/アトラス駆動のアセットでは必須です。
判断フロー
What does the texture represent?
├── Whole object from front/reference → Project-from-View style UVs from the validation camera
├── Atlas with separate parts → crop/map each part to its own UV island/rectangle
├── Repeating material → generated/object coords or tiled UVs
├── Face/expression decal → alpha material plane or projected UV island; no black background
├── Roughness/bump/normal map → Non-Color data, correct node type
└── Lightmap → separate UV/lightmap channel or optional multiply helper; not emission
必ず守るルール
- 画像テクスチャをレンダリング/エクスポートするには、マテリアルノードの設定が必要です。ビューポートで UV を表示するだけでは不十分です。
- Basecolor/albedo は sRGB です。Roughness、metallic、bump、normal、AO/lightmap は Non-Color です。
- アトラステクスチャは領域ごとにマッピングする必要があります。すべてのメッシュパーツにアトラス全体を適用しないでください。
- アルファデカールでは、アルファに接続したマテリアル設定(
BLEND、Alpha Hashed、またはAlpha Clip)と、適切にキー処理された/正しい PNG を使用する必要があります。黒い平面を残さないでください。 - GLB では、可能な限りエクスポーターが認識するノードを使用してください。具体的には、Image Texture 入力、UV、法線、接線を備えた Principled BSDF です。
- 最終的なマテリアル調整の前に、チェッカーテクスチャまたはオーバーレイレンダーで検証してください。
レシピ
ワールド X/Z の境界から前面投影 UV を作成する
import bpy
def assign_front_projected_uv(obj_name, uv_name='UV_front_projected'):
obj = bpy.data.objects[obj_name]
mesh = obj.data
uv = mesh.uv_layers.get(uv_name) or mesh.uv_layers.new(name=uv_name)
mesh.uv_layers.active = uv
xs = [v.co.x for v in mesh.vertices]
zs = [v.co.z for v in mesh.vertices]
minx, maxx = min(xs), max(xs)
minz, maxz = min(zs), max(zs)
dx = max(maxx - minx, 1e-8)
dz = max(maxz - minz, 1e-8)
for poly in mesh.polygons:
for li in poly.loop_indices:
co = mesh.vertices[mesh.loops[li].vertex_index].co
uv.data[li].uv = ((co.x - minx) / dx, (co.z - minz) / dz)
mesh.update()
メッシュをアトラス内の矩形にマッピングする
アトラスの矩形は、正規化 UV 座標で [u0, v0, u1, v1] です。ローカルな 0~1 の UV を作成した後に使用してください。
def remap_uv_rect(obj_name, rect, uv_name=None):
obj = bpy.data.objects[obj_name]
layer = obj.data.uv_layers.get(uv_name) if uv_name else obj.data.uv_layers.active
u0, v0, u1, v1 = rect
for item in layer.data:
u, v = item.uv
item.uv = (u0 + u * (u1-u0), v0 + v * (v1-v0))
obj.data.update()
正しいカラー空間を設定した画像テクスチャマテリアル
import bpy
def image(path, colorspace):
img = bpy.data.images.load(path, check_existing=True)
img.colorspace_settings.name = colorspace
return img
def make_pbr_texture_material(name, basecolor, roughness=None, normal_or_bump=None, alpha=False):
mat = bpy.data.materials.new(name)
mat.use_nodes = True
nt = mat.node_tree
bsdf = nt.nodes.get('Principled BSDF')
tex = nt.nodes.new('ShaderNodeTexImage')
tex.image = image(basecolor, 'sRGB')
nt.links.new(tex.outputs['Color'], bsdf.inputs['Base Color'])
if alpha and 'Alpha' in bsdf.inputs:
nt.links.new(tex.outputs['Alpha'], bsdf.inputs['Alpha'])
mat.blend_method = 'BLEND'
if roughness:
r = nt.nodes.new('ShaderNodeTexImage')
r.image = image(roughness, 'Non-Color')
nt.links.new(r.outputs['Color'], bsdf.inputs['Roughness'])
if normal_or_bump:
btex = nt.nodes.new('ShaderNodeTexImage')
btex.image = image(normal_or_bump, 'Non-Color')
bump = nt.nodes.new('ShaderNodeBump')
bump.inputs['Strength'].default_value = 0.02
nt.links.new(btex.outputs['Color'], bump.inputs['Height'])
nt.links.new(bump.outputs['Normal'], bsdf.inputs['Normal'])
return mat
ベイク先の設定
Blender でベイクするには、UV マップと、ベイク先としてアクティブな Image Texture ノードまたはカラー属性が必要です。ベイクには Cycles を使用してください。
import bpy
obj = bpy.data.objects['GEO-target']
bpy.context.scene.render.engine = 'CYCLES'
img = bpy.data.images.new('BAKE_target', 2048, 2048, alpha=True)
mat = obj.data.materials[0]
mat.use_nodes = True
node = mat.node_tree.nodes.new('ShaderNodeTexImage')
node.image = img
mat.node_tree.nodes.active = node
bpy.context.view_layer.objects.active = obj
obj.select_set(True)
bpy.ops.object.bake(type='DIFFUSE', pass_filter={'COLOR'}, margin=16)
img.filepath_raw = '/tmp/bake_target.png'
img.file_format = 'PNG'
img.save()
閉じた/押し出されたサーフェスのカバレッジ確認
閉じたアセットまたは押し出されたアセットでは、前面投影だけで終わらせないでください。closed-surface-uv-coverage を使用して、前面、背面、側面のマテリアル/UV/生成されたカバレッジを個別に確認してください。背面/側面のカーブオーバーレイはアクセントであり、テクスチャの塗りつぶしではありません。
検証チェックリスト
- UV レイヤーが存在し、アクティブです。
- 正面を向いたパーツに、チェッカーテクスチャの明らかな伸びがありません。
- アトラスの矩形はパーツごとに割り当てられており、どこにもアトラス全体を使用していません。
- Roughness/bump/normal/lightmap のカラー空間は Non-Color です。
- アルファマテリアルのブレンドモードが設定され、黒い背景平面がありません。
- ベースの GLB に想定される画像が埋め込まれている/エクスポートされ、参照用の平面が除外されています。
- 前面オーバーレイレンダーで、テクスチャがソーステンプレートに合っていることを確認できます。
要約した情報源
- Blender マニュアル:レンダリング時にテクスチャを出力するには、UV/画像テクスチャのワークフローでマテリアルノードが必要です。
- Blender マニュアル:Image Texture ノードの Vector が未接続の場合、アクティブな UV マップが使用されます。
- Blender マニュアル:Cycles でのベイクには UV マップと、アクティブな Image Texture/Color Attribute のターゲットが必要です。
- Blender マニュアル:glTF エクスポーターは、主に Principled BSDF に基づいてメッシュ、UV、テクスチャ、マテリアルをサポートしています。
- Khronos glTF PBR:ベースカラー、メタリック/ラフネス、法線、および関連するマップは、リアルタイム転送の中核となる概念です。
コメント
Markdown 対応