17

私は自分のツール用に独自の UV エディターを作成しており、投影用にできるだけ多くのアルゴリズムを取り入れようとしています。任意のメッシュを取得し、各頂点の UV 座標を作成する必要があります。

これまでのところ、平面と最小二乗コンフォーマル マップがあります。

3 平面、円柱、球面など、さらに組み込みたいのですが、アルゴリズムを実行するための情報を見つけるのに非常に苦労しています。トライプラナーは色を生成するように見えますが、すべてを UV 座標で取得する必要があります。

助けていただければ幸いです!!

4

3 に答える 3

30

トライプラナー

忘れてください:これは投影アルゴリズム(UV 座標を提供するアルゴリズム) ではなく、そこから UV 座標を取得する方法はありません。これは、各 XYZ 平面投影を個別に使用して得られる色をブレンドして得られる色を与えるレンダリング アルゴリズムです。

円筒形、球形

平面と同様に、他の頂点との接続を考慮せずに、XYZ 値から直接 UV 値を与える非常に単純な投影アルゴリズムです。

  • 円柱の場合: (x, y, z) を円柱座標 (ρ, φ, z) に変換し、UV 座標として u = φ および v = z を使用します。
  • 球面の場合: (x, y, z) を 球面座標(r, θ, φ) に変換し、UV 座標として u = θ および v = φ を使用します。

もちろん、X、Y、Z の役割を切り替えて別の軸を使用して投影したり、移動/回転/スケーリングを実行してより詳細に制御したりできます (使用する平面のサイズと方向を制御できるのと同じ方法です)。平面投影の場合)。

キュービック

まず、メッシュの各面をどの「投影面」に割り当てるかを決定する必要があります。下の図のように、投影面に X、-X、Y、-Y、Z、-Z という名前を付けます (ここでは、X、Y、Z 軸の色はそれぞれ赤、緑、青であると想定しています)。

ここに画像の説明を入力

このためには、法線 (nx、ny、nz) のどの座標が最大の絶対値を持つかを見つけ、それをこの軸と符号に対応する面に割り当てます。例えば:

  • n = (0.8, 0.5, 0.3) の場合、対応する面は X (|nx| が最大で nx が正)
  • n = (0.3, 0.8, 0.5) の場合、対応する面は Y (|ny| が最大で ny が正)
  • n = (0.3, -0.8, 0.5) の場合、対応する面は -Y (|ny| が最大で ny が負)

次に、メッシュのすべての面を割り当てる投影面がわかったら、対応する平面投影をこの面の周りの頂点に適用して、一時的な値 (u_temp, v_temp) ∈ [0,1] x [0, 1]。

次のステップは、この値 uv_temp ∈ [0,1] x [0,1] を、上の画像 A に示すように、より小さい正方形に含まれる値 uv に変換することです。たとえば、投影 "X" を適用した場合、uv ∈ [2/3, 3/3] x [2/4, 3/4] が必要な場合は、次のようにします。

u = 2./3. + u_temp/3.;
v = 2./4. + v_temp/4.; 

最後に、最後のステップは、平面投影が異なる 2 つの面に属する UV 頂点を複製することを忘れないことです (図の異なる色の間の境界線)。実際、メッシュの一部の頂点は、適切な結果を得るために、UV マップ内のいくつかの位置に分割できます (ほとんどの場合は分割する必要があります)。

于 2013-09-04T02:44:16.283 に答える
3

キュービック マッピング

(rx, ry, rz) ベクトルに基づいてこれを行う標準的な方法は、最初にテーブル内のいくつかの値を検索することです。これらの値は、頂点ごとの (s,t) (または (u,v)) テクスチャ座標に使用されます。

まず、反射ベクトル R = 2(N dot V)N - V を見つけます。ここで、V = 頂点、N = 法線、R 反射ベクトル(rx,ry,rz)

                      major axis 
                      direction      sc     tc     ma 
                      ---------      ---    ---    -- 
                      +rx            -rz    -ry    rx 
                      -rx            +rz    -ry    rx 
                      +ry            +rx    +rz    ry 
                      -ry            +rx    -rz    ry 
                      +rz            +rx    -ry    rz 
                      -rz            -rx    -ry    rz 

sc、tc、および ma に値が割り当てられると、その面の (s,t) 座標は次の式で計算できます。

if((rx >= ry) && (rx  >= rz)) 
{ 
sc = -rz; 
tc = -ry; 
ma = fabs(rx);  //absolute value
s = ((sc/ma) + 1) / 2; 
t = ((tc/ma) + 1) / 2; 

cout << "+rx (" << s << "," << t << ")" << endl; 
} 

  if((rx <= ry) && (rx  <= rz)) 
{ 
sc = +rz; 
tc = -ry; 
ma = fabs(rx); 
s = ((sc/ma) + 1) / 2; 
t = ((tc/ma) + 1) / 2; 

cout << "-rx (" << s << "," << t << ")" << endl; 
} 

if((ry >= rz) && (ry >= rx)) 
{ 
sc = +rx; 
tc = +rz; 
ma = fabs(ry); 
s = ((sc/ma) + 1) / 2; 
t = ((tc/ma) + 1) / 2; 

cout << "+ry (" << s << "," << t << ")" << endl; 
} 

if((ry <= rz) && (ry <= rx)) 
{ 
sc = +rx; 
tc = -rz; 
ma = fabs(ry); 
s = ((sc/ma) + 1) / 2; 
t = ((tc/ma) + 1) / 2; 

cout << "-ry (" << s << "," << t << ")" << endl; 
} 

if((rz >= ry) && (rz >= rx)) 
{ 
sc = +rx; 
tc = -ry; 
ma = fabs(rz); 
s = ((sc/ma) + 1) / 2; 
t = ((tc/ma) + 1) / 2; 

cout << "+rz (" << s << "," << t << ")" << endl; 
} 

if((rz <= ry) && (rz <= rx)) 
{ 
sc = -rx; 
tc = -ry; 
ma = fabs(rz); 
s = ((sc/ma) + 1) / 2; 
t = ((tc/ma) + 1) / 2; 

cout << "-rz (" << s << "," << t << ")" << endl; 
} 

参照 http://www.unc.edu/~zimmons/cs238/maps/cubeind.html

球形、立方体、放物線環境マッピングhttp://www.unc.edu/~zimmons/cs238/maps/environment.html

OP は、UV 座標を生成するための最小二乗コンフォーマル マッピング アルゴリズムを教えてください。ありがとうございました。

于 2013-11-12T17:38:37.017 に答える
2

siggraph コースのMesh Parameterization: Theory and Practiceから始めて、実装しているアルゴリズムの詳細について引用された論文を調べてください。

于 2013-09-02T21:05:28.600 に答える