mcpField
B
blender-uv-texturing

blender-uv-texturing

github.com/roble3クリエイティブ・メディア1281.2k 回インストール2 週間前に更新
リポジトリ

blender-uv-texturing について

画像テクスチャやアトラスを 3D モデルに適合させる Blender スキルです。UV マッピング、マテリアル設定、ベイク、検証を扱い、テンプレート駆動のアセットに対応します。

主な機能

  1. 01ビュー投影 UV マッピング
  2. 02パーツごとのアトラス割り当て
  3. 03PBR テクスチャと色空間の設定
  4. 04アルファデカールの設定
  5. 05ベイクターゲットの設定
  6. 06UV とエクスポートの検証

活用シーン

  1. 01アトラスをモデルの各パーツに適用
  2. 02ラフネス、法線、ライトマップの設定
  3. 03黒い背景板のないアルファデカールの構成
  4. 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

必ず守るルール

  1. 画像テクスチャをレンダリング/エクスポートするには、マテリアルノードの設定が必要です。ビューポートで UV を表示するだけでは不十分です。
  2. Basecolor/albedo は sRGB です。Roughness、metallic、bump、normal、AO/lightmap は Non-Color です。
  3. アトラステクスチャは領域ごとにマッピングする必要があります。すべてのメッシュパーツにアトラス全体を適用しないでください。
  4. アルファデカールでは、アルファに接続したマテリアル設定(BLEND、Alpha Hashed、または Alpha Clip)と、適切にキー処理された/正しい PNG を使用する必要があります。黒い平面を残さないでください。
  5. GLB では、可能な限りエクスポーターが認識するノードを使用してください。具体的には、Image Texture 入力、UV、法線、接線を備えた Principled BSDF です。
  6. 最終的なマテリアル調整の前に、チェッカーテクスチャまたはオーバーレイレンダーで検証してください。

レシピ

ワールド 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:ベースカラー、メタリック/ラフネス、法線、および関連するマップは、リアルタイム転送の中核となる概念です。

コメント