UV チャンネルを処理する

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

Choose your operating system:

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 マッピングのレイアウトが不十分な場合にテクスチャ マテリアルを使用しようとすると、目視できるような問題が頻繁に発生します。例えば、UV マッピングに多くの 継ぎ目 (メッシュ ジオメトリ上で隣接する三角ポリゴンが UV マッピングでは隣接していない場所) がある場合、テクスチャではその継ぎ目にジョイントが表示されます。または、UV マッピングが UV 空間の領域をメッシュの三角ポリゴンに不均等に割り当てると (つまり、メッシュの大きな三角ポリゴンがテクスチャの小さな領域にマッピングされたり、その逆にマッピングされたりすると)、テクスチャは、メッシュのさまざまな部分で引き伸ばされたり歪んだりしたような見た目になります。

芸術的に最善の結果を得るには、常に専用のモデリング ツールで 3D オブジェクトの UV マッピングを作成するようにしてください。しかしながら、いつでもそうできるとは限りません。例えば、一部の CAD モデリング アプリケーションでは、そのアプリケーションから Unreal Engine へデータをインポートするとき、そのソース アプリケーションで高品質の UV マッピングを作成できない場合があります。このような場合は、Unreal Editor で UV マッピングを作成してください。

Unreal Editor でスタティックメッシュの UV マッピングを作成する方法は 2 つあります。

プロジェクト設定 以下に概説する UV チャンネル生成方法のいずれかを使用するには、Unreal Engine プロジェクトの Polygon Editing プラグインをインストールする必要があります。

方法 1:メッシュ ジオメトリをアンラップする

この方法では、スタティックメッシュ ジオメトリを構成する三角ポリゴンを自動的に展開および平坦化します。三角ポリゴンのサーフェス領域は、三角ポリゴンの隣接されたままになるように自動的に調整され、隣接するサーフェス間の角度が設定したしきい値を超えると継ぎ目が追加されます。

スタティックメッシュを新しい UV マッピングにアンラップするには次の手順を実行します。

  1. アンラップするスタティックメッシュを選択し、次のいずれかを実行します。

    • コンテンツ ブラウザ 内でスタティックメッシュを右クリックし、コンテキスト メニューから [Unwrap UV] を選択します。

      Unwrap UV in the Content Browser

    • 生成するスタティックメッシュをスタティックメッシュ エディタで開きます。次に、スタティックメッシュ エディタのツールバーから [UV] > [Unwrap UVs] を選択します。

      Unwrap UV in the Static Mesh Editor

    どちらのメニュー オプションも表示されない場合は、プロジェクトで Polygon Editing プラグインが有効になっていることを確認してください。

  2. アンラップの結果を制御するパラメータを設定します。

    Unwrap UV settings

    設定

    説明

    Channel Selection

    アンラップ プロセスが新しい UV マッピングを保存するチャンネルを選択する方法を決定します。

    • Automatic Lightmap Setup :アンラップされている UV マッピングを、このスタティックメッシュに設定されているチャンネルにライトマップ UV のソースとして保存し、新しい UV マッピングから新しいライトマップ UV を生成します。

    • First Empty Channel :アンラップされている UV マッピングをスタティックメッシュの最初の空の UV チャンネルに保存します。

    • Specify Channel : [UVChannel] 設定でチャンネル インデックスを指定するには、このオプションを選択します。

    UV Channel

    [Channel Selection] Specify Channel に設定されている場合、この設定を使用して、アンラップされた UV が保存される UV チャンネルのインデックスを決定します。

    Angle Threshold

    アンラップ後も接続されたままになっている面の、2 つの隣接する面の間の最大角度を決定します。この値を上げると、個別の UV アイランドの数が最小限に抑えられ、隣接するトライアングルの接続数が増え、テクスチャ マッピングで破壊を引き起こすおそれのあるシームの数が減ります。ただし、これにより、ラップされたテクスチャにより多くの歪みが発生する可能性があります。これは、トライアングルを 2D 空間でより積極的にサイズ変更して、隣同士の接続を維持する必要があるためです。

  3. [Proceed (続行)] をクリックします。

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

平面、ボックス、または球体などの投影ボリュームを使用して、スタティックメッシュの 3D ジオメトリを 2D テクスチャ空間に投影できます。この方法では、スタティックメッシュの各面が投影ボリュームの面に外側に投影され、投影ボリュームが 2D テクスチャ空間にアンラップされます。

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

  1. 生成するスタティックメッシュをスタティックメッシュ エディタで開きます。

    例えば、 コンテンツ ブラウザ でスタティックメッシュ アセットをダブルクリックします。

  2. スタティックメッシュ エディタ のツールバーで [UV] > [Generate UVs (UV を生成する)] を選択します。

    このメニュー オプションが表示されない場合は、プロジェクトの Polygon Editing プラグインを有効にしてください。

  3. [Generate UV] パネルが表示されます。パネルには、UV 投影の結果を制御するのに役立つ一連のコントロールが用意されています。

    Projection Settings in the Generate UV panel

    また、標準の Unreal Editor マニピュレータ ギズモとともに、ビューポートのスタティックメッシュの周囲に緑色のボリュームが表示されます。

    ボリュームとマニピュレータが最初に表示されない場合は、 [Generate UV] パネルの下部にある [Show Gizmo (Gizmo を表示)] ボタンを切り替えます。

  4. [Projection Type (プロジェクション タイプ)] 設定で、スタティックメッシュの寸法に最適なボリュームを選択します。

  5. スタティックメッシュの範囲に一致するように、ボリュームのサイズ、位置、回転を調整します。

    これを行うには、ビューポートのマニピュレータまたは [Generate UV] パネルのテキスト フィールドを使用できます。また、 [Fit (合わせる)] ボタンで、スタティックメッシュ ジオメトリの範囲にボリュームを適切な開始点として自動的に合わせることができます。

  6. [Target Channel] 設定で、投影された UV マッピングを保存するチャンネルのインデックスを設定します。

    ほとんどのマテリアルはチャンネル 0 からテクスチャ座標を取得します。UV マッピングを生成して、スタティックメッシュ ジオメトリの周囲のテクスチャのマッピング方法を改善する場合、通常、このフィールドには「 0 」を設定します。

  7. [Apply] をクリックして UV マッピングを生成し、スタティックメッシュのターゲット チャンネルに保存します。

次の表に、 [Generate UV] パネルのすべての設定を示します。

設定

説明

Projection Type

スタティックメッシュ ジオメトリが投影されるボリューム。

Size

投影ボリュームの寸法。

Position

スタティックメッシュのピボット ポイントに対する投影ボリュームの位置。

Rotation

スタティックメッシュのピボット ポイントに対する投影ボリュームの回転。

UV Tiling Scale

UV 空間での投影のスケール。値を大きくすると、テクスチャ空間で投影が大きくなり、メッシュのサーフェスに巻き付けたときにテクスチャの詳細が小さく表示されます。

UV Offset

2D テクスチャ空間での投影の配置を制御します。X 軸の値が小さいほど、UV マッピングで投影が左に移動します。値を大きくすると、投影が右に移動します。Y 軸の値が小さいと、UV マッピングで投影が上に移動します。値を大きくすると、投影が下に移動します。

Target Channel

投影が保存される UV チャンネルのインデックス。これは、生成されたライトマップ UV を保存するためにスタティックメッシュ エディタで使用されているチャンネルと同じチャンネルにすることはできません。ターゲット チャンネルにすでにデータが含まれている場合は、続行する前にエディタから確認を求められます。

Show Gizmo

ビューポートでの投影ボリュームとマニピュレータ ギズモのレンダリングを切り替えます。

Apply

上記の設定に従って UV 投影を生成し、結果を [Target Channel] で設定したターゲット チャンネルに保存します。

Fit

投影ボリュームのサイズがスタティックメッシュの完全なジオメトリを囲むようにします。

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

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

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

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

Blueprints

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 マッピングを作成できます。三角ポリゴンのサーフェス領域は、三角ポリゴンの隣接されたままになるように自動的に調整され、隣接するサーフェス間の角度が設定したしきい値を超えると継ぎ目が追加されます。

プロジェクト設定 以下に概説する UV チャンネル生成方法を使用するには、Unreal Engine プロジェクトの Polygon Editing プラグインをインストールする必要があります。

Generate Unwrapped UVs ノードを使用します。以下をこのノードに渡す必要があります。

  • 変更するスタティックメッシュ アセットへの参照。

  • アンラップされた UV を保存する UV チャンネルのインデックス。この UV チャンネルが存在しない場合は、アンラップを行うプロセスで作成されます。

  • アンラップ後も接続されたままになっている面の、2 つの隣接する面の間の最大角度。この値を上げると、個別の UV 「アイランド」の数が最小限に抑えられ、隣接する三角ポリゴンの接続数が増えて、テクスチャ マッピングで破壊を引き起こすおそれのある継ぎ目 (シーム) の数が減ります。ただし、これにより、ラップされたテクスチャにより多くの歪みが発生する可能性があります。これは、三角ポリゴンを 2D 空間でより積極的にサイズを変更して、隣同士の接続を維持する必要があるためです。

次に例を示します。

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

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

次に説明する各ノードは、指定した UV チャンネルに作成した 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 マッピングを作成できます。三角ポリゴンのサーフェス領域は、三角ポリゴンの隣接されたままになるように自動的に調整され、隣接するサーフェス間の角度が設定したしきい値を超えると継ぎ目が追加されます。

プロジェクト設定 以下に概説する UV チャンネル生成方法を使用するには、Unreal Engine プロジェクトの Polygon Editing プラグインをインストールする必要があります。

unreal.UVGenerationFlattenMapping.generate_flatten_mapping_u_vs() 関数を使用します。これに次を渡します。

  • 変更するスタティックメッシュ アセットへの参照。

  • アンラップされた UV を保存する UV チャンネルのインデックス。この UV チャンネルが存在しない場合は、アンラップを行うプロセスで作成されます。

  • アンラップ後も接続されたままになっている面の、2 つの隣接する面の間の最大角度。この値を上げると、個別の UV 「アイランド」の数が最小限に抑えられ、隣接する三角ポリゴンの接続数が増えて、テクスチャ マッピングで破壊を引き起こすおそれのある継ぎ目 (シーム) の数が減ります。ただし、これにより、ラップされたテクスチャにより多くの歪みが発生する可能性があります。これは、三角ポリゴンを 2D 空間でより積極的にサイズを変更して、隣同士の接続を維持する必要があるためです。

次に例を示します。

import unreal
asset_name = '/Game/Meshes/StaticMesh'
# スタティックメッシュ アセットをロードします。
loaded_asset = unreal.EditorAssetLibrary.load_asset(asset_name)
# UV チャンネルの保存先を指定します。
channel_index = 2
# 角度の閾値を設定します。
angle_threshold = 55
# メッシュを UV チャンネルにアンラップします。
unreal.UVGenerationFlattenMapping.generate_flatten_mapping_u_vs(loaded_asset, channel_index, angle_threshold)
# 変更したアセットを保存します。
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 チャンネルはすでに存在している必要があります。関数では 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)
Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
閉じる