UV チャンネルを処理する

スタティック メッシュをレンダリングするための UV チャンネルの役割と Unreal Editor で処理する方法を示します。

Windows
MacOS
Linux

UV チャンネルはスタティック メッシュのデータ セットで、メッシュの各頂点を 2D 空間の座標にマップしたものです。これらのマッピングでは、メッシュをレンダリングするときに 2D テクスチャ マップが 3D ジオメトリを包み込む方法を定義します。

一般に専用のモデリング ツールで UV マッピングを作成し管理します。スタティック メッシュのジオメトリを作成するために使用するツールそのものです。ただし、このエディタにはモデルの UV チャンネルを処理するいくつかの機能が用意されていて、このページで概要を説明します。

UV チャンネルにはエンジンで 2 つの主な目的があります。

  • マテリアルのテクスチャ座標 - テクスチャ マップをサンプリングし、メッシュのサーフェスに適用するマテリアルを作成するとき、テクスチャ座標 (Texcoord) ノードを使用して、UV チャンネルを指定できます。マテリアルは選択した UV チャンネルに含まれる 2D 座標と 3D 頂点位置の間のマッピングを使用して、テクスチャのどこの領域が、3D モデルのどのトライアングルをシェーディングするために使用するのかを決定します。

    例えば、シンプルな平面のスタティック メッシュの UV Channel 0 (この画像の右上に表示) ではメッシュの 2 つのトライアングル (A と B) をテクスチャ空間にマップする最も簡単な方法を示します。UV チャンネル (TexCoord ノードの Coordinate Index プロパティで設定) を使用するとき、マテリアルはテクスチャの幅と高さ全体を平面に適用します。
    texture-mapping-1-1.png
    一方、次の画像では UV Channel 1 を示しています。これはトライアングルと UV テクスチャ空間のマッピングを回転し、歪めたものです。同じイメージ テクスチャをスタティック メッシュに適用するとき、適用されるテクスチャの部分とスタティック メッシュの部分が変わります。
    texture-mapping-2.png
    UV マッピングのトライアングルはオーバーラップできます。オーバーラップはテクスチャの同じ部分が、3D スタティック メッシュ ジオメトリの複数部分に適用されるというだけの意味です。

    「UV チャンネル」の U はテクスチャの水平軸で、V は垂直軸です。テクスチャ座標は一般に 0 から 1 の範囲で、(0,0) はテクスチャの左下、(1,1) は右上を表します。ただし、これに限りません。デフォルトでは、U または V の値が 1 を上回る、あるいは0 を下回ると、マテリアルはテクスチャの反対側を「包みこみ」ます。例えば、V の値が 1.25 であると一般に 0.25 として処理されます。ただし、マテリアルでこれらの値を固定して、最小値を 0 に最大値を 1 に制限できます。

  • ライトマップ - UV チャンネルはライトマップを格納し適用するためにも使用されます。ライトマップは特殊なテクスチャで、スタティック メッシュに対して事前に計算されたライティング情報が格納されます。[Mobility (可動性)] が [Stationary] または [Static] に設定されているライトがレベルにあり、レベルのライティングをビルドすると、ライトマス ツールは間接ライティング (および Static ライトの直接ライティング) をライトマップ テクスチャに保存します。このとき UV チャンネルを使用してスタティック メッシュの 3D ジオメトリと 2D テクスチャ空間のマッピングを決定します。

    ライトマップに使用される UV チャンネルにはいくつか特別なルールがあります。一般にオブジェクトの各部は受け取る光の量が異なり、メッシュの 2 つのトライアングルで 2D テクスチャ空間をオーバーラップできるものはないからです。各トライアングルはテクスチャの独自の領域をカバーする必要があります。さらに、すべての UV 座標値は 0 から 1 の範囲に収まる必要があります。ライトマップ テクスチャは通常のテクスチャ マッピングと同様に「包み込む」ことはできません。
    これらの理由で、一般にライトマップ UV はシンプルな UV マッピングから生成 — つまり パック されます。

    例えば、このピラーのテクスチャ マッピング UV チャンネルは 4 つの各側面のジオメトリをテクスチャの同じオーバーラップ領域にマップします。この UV チャンネルを使用してテクスチャをジオメトリに適用するとき、各側面はテクスチャの同じ部分を使用します。
    texture-mapping-pillar.png
    ただし、オブジェクトのライトマップ UV で各側面は 2D 空間の独自の領域をカバーする必要があります。
    texture-mapping-pillar-packed.png
    ライトマップ UV および生成方法の詳細については、ライトマップで UV をアンラップする およびライトマップ UV を生成する を参照してください。

エンジンの各スタティック メッシュには最大 7 種類の UV チャンネルを保持でき、異なるマテリアル向け (または単一のマテリアル内の異なるテクスチャ サンプリング ノード向け) にテクスチャをラップする方法を複数セットアップできます。

スタティック メッシュ エディタの UV チャンネル

スタティック メッシュ エディタ UI で、UV チャンネルのリスト、表示、削除を実行できます。

UV チャンネルをリストする

スタティック メッシュ エディタでスタティック メッシュ アセットを開いているとき、ツールバーの [UV] ボタンで、現在のスタティック メッシュで使用されている UV チャンネルの一覧を表示できます。

List UV Channels

UV チャンネルを視覚化する

リストの UV チャンネルを選択すると、ビューポートのオーバーレイとして 2D テクスチャ空間にマップされたメッシュのトライアングルが表示されます。

Visualize UV Channels

リストの一番上で [None] を選択すると、UV オーバーレイの表示がなくなります。

UV チャンネルを削除する

リストでチャンネルを選択すると、削除できます。各 UV チャンネルにはスタティック メッシュの一部として各頂点のテクスチャ座標を格納します。したがって、使用しないマッピングを削除することによって、いくらかのランタイム メモリを節約できることがあります。

Remove selected UV channel

削除されたチャンネルの後にリストに存在する他のすべての UV チャンネルは、削除されたことによって空いたスペースを埋めるように移動します。

スタティック メッシュ アセットがライトマップ UV を生成するようにセットアップされている場合、選択した UV チャンネルがライトマップ UV のソースまたは宛先チャンネルとして使用している場合、UV チャンネルを削除できません。[Build Settings (ビルド設定)] > [Generate Lightmap UVs (ライトマップUVの作成)] オプションを無効にする、または [Build Settings] > [Source Lightmap Index (ソース ライトマップ インデックス)] および [Build Settings] > [Destination Lightmap Index (宛先ライトマップ インデックス)] 設定を異なる UV チャンネルに変更します。

スタティックメッシュを作成する

モデルに UV マッピングなない、または UV マッピングが十分でないと、テクスチャかされたマテリアルを使った際に問題が発生します。UV マッピングによって、テクスチャのどの部分がサーフェスのどの部分に適用するかを制御するため、至るところにシームのあるマッピングはテクスチャがつぎはぎだらけに見え、メッシュのトライアングルい対して UV スペースの割当にむらがあるマッピングはオブジェクトのさまざまな場所でテクスチャが伸縮や湾曲しているように見えます。[Genera UVs] ウインドウにある制御を使用して、対象サーフェスに正確に一致する UV マップを作成してください。

この機能は現時点では 3D メッシュから 2D へプロジェクションのみを対象としています。フル機能のモデリングおよびテクスチャ ツールで使用できるフル プロジェクション編集機能はありません。

[Distance Field Resolution Scale] で変更することができます。 Create Uvs

  1. スタティック メッシュ エディタの場合:

  2. 目的とする UV の外観に最も近いプロジェクション タイプを選択します。

  3. サイズ、位置、回転を適宜調整してサーフェスに一致させます。

  4. UV Tiling Scale 制御を使用して、U 軸と V 軸に合わせて UV を設定します。

  5. UV を適用するチャンネルを選択します。

  6. [Fit] を

  7. [Apply] をクリックして、UV 座標を作成して UV マップをメッシュに合わせます。

エディタ スクリプティングでの UV チャンネル

Unreal Editor で実行するブループリントや Python スクリプトで UV チャンネルを処理することもできます。スタティック メッシュ エディタで実行できることは何でもできます。さらに新しいチャンネルを追加し、新しい UV マッピングを生成できます。

前提条件: 今回の使用が初めての場合は、Editor Scripting Utilities プラグインをインストールしてください。詳細は、エディタをスクリプト化および自動化する をご参照ください。

実装方法を選んでください。

ブループリント

Python

UV チャンネルの管理が必要なノードは、[Editor Scripting] > [Static Mesh] カテゴリに表示されます。

これらのノードを使用するには、PlacedEditorUtilityBase クラスなど、エディタのみのクラスから派生したブループリント クラスである必要があります。詳細は ブループリントを使ってエディタをスクリプト化する をご参照ください。

これらのすべての関数は、[Editor Scripting] > [Asset Library] > [Load Asset] ノードを呼び出すことによって、一般にロードが必要なスタティック メッシュ アセットを処理します。

UV チャンネルを変更することでアセットに変更が加えられます。加える変更を維持する場合は、後から [Editor Scripting] > [Asset Library] > [Save Asset] または [Save Loaded Asset] などのノードも使用する必要があります。以下の例を見てみましょう。

UV チャンネルをリストする

Get Num UV Channels ノードを使用して、対象のスタティック メッシュ アセットに現在、何個の UV チャンネルがあるのか検出できます。

次に例を示します。

UV チャンネルを削除する

各 UV チャンネルにはスタティック メッシュの一部として各頂点のテクスチャ座標を格納します。したがって、使用しないマッピングを削除することによって、いくらかのランタイム メモリを節約できることがあります。

UV チャンネルを削除するには、Remove UV Channel ノードを呼び出します。これに削除対象の UV チャンネルのインデックスとスタティック メッシュ アセットを渡します。

次に例を示します。

指定インデックスのチャンネルが削除された後にリストに存在する他のすべての UV チャンネルは、削除されたことによって空いたスペースを埋めるようにインデックスが変わります。

スタティック メッシュ アセットがライトマップ UV を生成するようにセットアップされている場合、選択した UV チャンネルがライトマップ UV のソースまたは宛先チャンネルとして使用している場合、UV チャンネルを削除できません。[Build Settings (ビルド設定)] > [Generate Lightmap UVs (ライトマップUVの作成)] オプションを無効にする、または [Build Settings] > [Source Lightmap Index (ソース ライトマップ インデックス)] および [Build Settings] > [Destination Lightmap Index (宛先ライトマップ インデックス)] 設定を異なる UV チャンネルに変更します。

新規 UV チャンネルを追加する

新規 UV チャンネルをスタティック メッシュ アセットに、次のノードのいずれかを呼び出すことによって追加できます。

  • Add UV Channel (UV チャンネルを追加) - 既存のチャンネル リストの最後に新しいチャンネルを追加します。

  • Insert UV Channel (UV チャンネルを挿入) - 指定したインデックスで新しいチャンネルを追加します。リストで他の UV チャンネルのインデックスを 1 つずつ移動します。UV チャンネルの配列に間を空けることはできないことに注意してください。隣に別の既存のチャンネルがある場所にのみ新しいチャンネルを挿入できます。例えば、リストに 3 つの UV チャンネル (インデックス 0、1、2) がある場合、インデックス 3 で新しいチャンネルを追加できますが、インデックス 4 ではできません。

新しいマッピングは空です。使用する前に何らかの方法で導入します。(次に示す) メッシュ ジオメトリを投影する、またはライトマップ生成の宛先として使用することによって導入します。

メッシュ ジオメトリを UV チャンネルに投影する

新しい UV マッピングは、スタティック メッシュのトライアングルを 2D 平面またはシンプルな 3D ボリュームに投影することで作成できます。

これは現在、スタティック メッシュ エディタの UI ではなく、Unreal Editor スクリプティング API でのみ公開されていますただし、3ds Max のツールのような、メッシュ投影用のビジュアル ツールの知識がある場合は、API で必要なプロセスと設定が簡単に理解できます。詳細については、3ds Max ヘルプの UVW Map Modifier をご参照ください。

次に説明する各ノードは、指定した UV チャンネルに作成した UV マッピングを保存します。UV チャンネルは存在している必要があり、存在しない場合に関数は作成しません。

平面投影

Generate Planar UV Channel ノードを使用して、スタティック メッシュ ジオメトリを平面に投影します。スタティック メッシュの一方の側面だけをテクスチャで包み込む必要がある場合に、この種の投影を使用します。

次に例を示します。

円筒投影

Generate Cylindrical UV Channel ノードを使用して、スタティック メッシュ ジオメトリを円筒の側面、上面、下面に投影します。

次に例を示します。

ボックス投影

Generate Box UV Channel ノードを使用して、スタティック メッシュ ジオメトリをキューブの各面に投影します。

例えば、次のスクリプトではスタティック メッシュとほぼ同じサイズのボックスを作成し、スタティック メッシュのジオメトリをそのボックスの側面に投影することで新しい UV マッピングを作成します。

unreal.EditorStaticMeshLibrary クラスで LOD 管理関数を見つけます。

これらの関数のすべてはスタティック メッシュ アセットと連携します。 unreal.EditorAssetLibrary.load_asset のような関数を呼び出すことによって一般にロードする必要があります。

UV チャンネルを変更することでアセットに変更が加えられます。加える変更を維持する場合は、後から unreal.EditorAssetLibrary.save_asset または unreal.EditorAssetLibrary.save_loaded_asset などの関数も使用する必要があります。

UV チャンネルをリストする

unreal.EditorStaticMeshLibrary.get_num_uv_channels 関数を使用して、対象のスタティック メッシュ アセットに現在、何個の UV チャンネルがあるのか検出できます。

次に例を示します。

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# スタティック メッシュ アセットをロードします。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# アセットに保存されている UV チャンネル数を取得します。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
print("Number of UV channels: " + str(num_uv_channels))

UV チャンネルを削除する

各 UV チャンネルにはスタティック メッシュの一部として各頂点のテクスチャ座標を格納します。したがって、使用しないマッピングを削除することによって、いくらかのランタイム メモリを節約できることがあります。

UV チャンネルを削除するには、unreal.EditorStaticMeshLibrary.remove_uv_channel 関数を呼び出します。これに削除対象の UV チャンネルのインデックスとスタティック メッシュ アセットを渡します。

例:

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# スタティック メッシュ アセットをロードします。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# アセットに保存されている UV チャンネル数を取得します。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
# リストの最後のチャンネルを削除します。
channel_to_remove = num_uv_channels - 1
unreal.EditorStaticMeshLibrary.remove_uv_channel(asset_name, channel_to_remove)
# 変更したアセットを保存します。
unreal.EditorAssetLibrary.save_asset(asset_name)

指定インデックスのチャンネルが削除された後にリストに存在する他のすべての UV チャンネルは、削除されたことによって空いたスペースを埋めるようにインデックスが変わります。

スタティック メッシュ アセットがライトマップ UV を生成するようにセットアップされている場合、選択した UV チャンネルがライトマップ UV のソースまたは宛先チャンネルとして使用している場合、UV チャンネルを削除できません。[Build Settings (ビルド設定)] > [Generate Lightmap UVs (ライトマップUVの作成)] オプションを無効にする、または [Build Settings] > [Source Lightmap Index (ソース ライトマップ インデックス)] および [Build Settings] > [Destination Lightmap Index (宛先ライトマップ インデックス)] 設定を異なる UV チャンネルに変更します。

新規 UV チャンネルを追加する

新規 UV チャンネルをスタティック メッシュ アセットに、次の関数のいずれかを呼び出すことによって追加できます。

  • unreal.EditorStaticMeshLibrary.add_uv_channel - 既存のチャンネル リストの最後に新しいチャンネルを追加します。

  • unreal.EditorStaticMeshLibrary.insert_uv_channel - 指定したインデックスで新しいチャンネルを追加します。リストで他の UV チャンネルのインデックスを 1 つずつ移動します。UV チャンネルの配列に間を空けることはできないことに注意してください。隣に別の既存のチャンネルがある場所にのみ新しいチャンネルを挿入できます。例えば、リストに 3 つの UV チャンネル (インデックス 0、1、2) がある場合、インデックス 3 で新しいチャンネルを追加できますが、インデックス 4 ではできません。

例:

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# スタティック メッシュ アセットをロードします。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# アセットに保存されている UV チャンネル数を取得します。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
print("Number of UV channels before: " + str(num_uv_channels))
# リストの最後にチャンネルを追加します。
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
# リストの先頭にチャンネルを追加します。
unreal.EditorStaticMeshLibrary.insert_uv_channel(asset_name, 0)
# アセットに保存されている UV チャンネルの新しい数を取得します。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
print("Number of UV channels after: " + str(num_uv_channels))
# 変更したアセットを保存します。
unreal.EditorAssetLibrary.save_asset(asset_name)

新しいマッピングは空です。使用する前に何らかの方法で導入します。(次に示す) メッシュ ジオメトリを投影する、またはライトマップ生成の宛先として使用することによって導入します。

メッシュ ジオメトリを UV チャンネルに投影する

新しい UV マッピングは、スタティック メッシュのトライアングルを 2D 平面またはシンプルな 3D ボリュームに投影することで作成できます。

これは現在、スタティック メッシュ エディタの UI ではなく、Unreal Editor スクリプティング API でのみ公開されていますただし、3ds Max のツールのような、メッシュ投影用のビジュアル ツールの知識がある場合は、API で必要なプロセスと設定が簡単に理解できます。詳細については、3ds Max ヘルプの UVW Map Modifier をご参照ください。

次に説明する各関数は、指定した UV チャンネルに作成した UV マッピングを保存します。UV チャンネルは存在している必要があり、存在しない場合に関数は作成しません。

平面投影

unreal.EditorStaticMeshLibrary.generate_planar_uv_channel 関数を使用して、スタティック メッシュ ジオメトリを平面に投影します。スタティック メッシュの一方の側面だけをテクスチャで包み込む必要がある場合に、この種の投影を使用します。

例:

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# スタティック メッシュ アセットをロードします。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 投影する LOD を指定します。
lod_index = 0
# 投影用に新しい UV チャンネルを追加します。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
channel_index = num_uv_channels
# 投影面「ギズモ」をセットアップします。
bbox = loaded_asset.get_bounding_box()
gizmo_pos = ((bbox.min + bbox.max) * 0.5)   # オブジェクトのバウンディング ボックスの中央を検出します。
# 回転角 (度単位) を設定します。
pitch = 0   # X 軸周り
yaw = 0     # Y 軸周り
roll = 0    # Z 軸周り
gizmo_orientation = unreal.Rotator(pitch, yaw, roll)
# 値を増減して、投影を拡大または縮小します。
tiling = unreal.Vector2D(1, 1)
# スタティック メッシュ ジオメトリを UV チャンネルに投影します。
unreal.EditorStaticMeshLibrary.generate_planar_uv_channel(loaded_asset, lod_index, channel_index, gizmo_pos, gizmo_orientation, tiling)
# 変更したアセットを保存します。
unreal.EditorAssetLibrary.save_asset(asset_name)

円筒投影

unreal.EditorStaticMeshLibrary.generate_cylindrical_uv_channel 関数を使用して、スタティック メッシュ ジオメトリを円筒の側面、上面、下面に投影します。

次に例を示します。

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# スタティック メッシュ アセットをロードします。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 投影する LOD を指定します。
lod_index = 0
# 投影用に新しい UV チャンネルを追加します。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
channel_index = num_uv_channels
# 投影円筒「ギズモ」をセットアップします。
bbox = loaded_asset.get_bounding_box()
gizmo_pos = ((bbox.min + bbox.max) * 0.5)   # オブジェクトのバウンディング ボックスの中央を検出します。
# 回転角 (度単位) を設定します。
pitch = 0   # X 軸周り
yaw = 0     # Y 軸周り
roll = 0    # Z 軸周り
gizmo_orientation = unreal.Rotator(pitch, yaw, roll)
# 値を増減して、投影を拡大または縮小します。
tiling = unreal.Vector2D(1, 1)
# スタティック メッシュ ジオメトリを UV チャンネルに投影します。
unreal.EditorStaticMeshLibrary.generate_cylindrical_uv_channel(teapot, lod_index, channel_index, gizmo_pos, gizmo_orientation, tiling)
# 変更したアセットを保存します。
unreal.EditorAssetLibrary.save_asset(asset_name)

ボックス投影

unreal.EditorStaticMeshLibrary.generate_box_uv_channel 関数を使用して、スタティック メッシュ ジオメトリをキューブの各面に投影します。

例えば、次のスクリプトではスタティック メッシュとほぼ同じサイズのボックスを作成し、スタティック メッシュのジオメトリをそのボックスの側面に投影することで新しい UV マッピングを作成します。

import unreal
asset_name = '/Game/Path/MyStaticMeshAsset'
# スタティック メッシュ アセットをロードします。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# 投影する LOD を指定します。
lod_index = 0
# 投影用に新しい UV チャンネルを追加します。
num_uv_channels = unreal.EditorStaticMeshLibrary.get_num_uv_channels(asset_name)
unreal.EditorStaticMeshLibrary.add_uv_channel(asset_name)
channel_index = num_uv_channels
# 投影ボリューム「ギズモ」をセットアップします。
bbox = loaded_asset.get_bounding_box()
gizmo_pos = ((bbox.min + bbox.max) * 0.5)   # Find the center of the object's bounding box.
# 回転角 (度単位) を設定します。
pitch = 0   # X 軸周り
yaw = 0     # Y 軸周り
roll = 0    # Z 軸周り
gizmo_orientation = unreal.Rotator(pitch, yaw, roll)
# ボックスのサイズを取得します。
gizmo_size = bbox.max - bbox.min
# スタティック メッシュ ジオメトリを UV チャンネルに投影します。
unreal.EditorStaticMeshLibrary.generate_box_uv_channel(box, channel_index, lod_index, gizmo_pos, gizmo_orientation, gizmo_size)
# 変更したアセットを保存します。
unreal.EditorAssetLibrary.save_asset(asset_name)
Select Skin
Light
Dark

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信