0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Blender】自動で均等にオフセットをかけてUVのラッピングを一括解消するスクリプト

Last updated at Posted at 2024-09-21

概要

要はこういうことができます。
image.png

用途

アルベドマップはメモリ削減のためにUVをラッピングさせて使いまわしたいけど、完全に重ねるとSubstancePainterなど外部ツールでのマップベイクで問題が起きる、みたいなときに使えるかと思います。
(なんか自動アンラップみたいな機能があるらしいですが、私のバージョンは古すぎるのかそのあたりの項目が見当たりませんでした。どっちにしろ不健全なリソースではあるのでBlender時点でこうしてしまおうという魂胆です。)

使用方法

ChatGPTに書いてもらいました。
まず、テキストエディタを開きます。
image.png

テキストを新規作成します。
image.png

そうしたら、以下の内容を貼り付けます。

import bpy
import bmesh

# テクスチャ1枚分のオフセット値(通常は1.0が標準サイズ)
offset_value = 1.0

# アクティブオブジェクトを取得
obj = bpy.context.active_object

# UVマップが存在するか確認
if not obj.data.uv_layers:
    print("UVマップが存在しません")
else:
    # 編集モードに切り替え
    bpy.ops.object.mode_set(mode='EDIT')

    # BMeshを作成
    bm = bmesh.from_edit_mesh(obj.data)

    # UVレイヤーを取得
    uv_layer = bm.loops.layers.uv.verify()

    # 選択された面を取得
    selected_faces = [f for f in bm.faces if f.select]

    if len(selected_faces) == 0:
        print("選択された面がありません。")
    else:
        # 最初の面のUVはそのままで、2つ目以降の面のUVをオフセット
        for i, face in enumerate(selected_faces):
            offset_x = i * offset_value
            
            for loop in face.loops:
                uv = loop[uv_layer].uv
                uv.x += offset_x  # X方向にオフセットを加える

        # UVの変更を反映
        bmesh.update_edit_mesh(obj.data)

    print("UVオフセットの適用が完了しました。")


編集モードに入り、UVエディタの面選択モード→「Bキー」の矩形選択などでラッピングしている面を選択します。

image.png

面を選択したら、テキストエディタの再生ボタンでスクリプトを実行します。
image.png

成功すると、以下のような結果になっていることが確認できます。
image.png

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?