web-dev-qa-db-ja.com

UV座標アルゴリズムの自動生成

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

これまでのところ、平面で最小二乗の等角写像があります。

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

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

15

3平面

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

円筒形、球形

平面のように、これらは非常に単純な投影アルゴリズムであり、他の頂点との接続性を考慮せずに、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軸の色はそれぞれ赤、緑、および青であると想定しています)。

enter image description here

このためには、法線のどの座標(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マップのいくつかの位置に分割できます(ほとんどの場合、分割する必要があります)。

26
Boris Dalstein

Siggraphコースから始める必要があります メッシュパラメータ化:理論と実践 次に、実装しているアルゴリズムの詳細について、引用された論文を調べてください。

2
a.lasram

キュービックマッピング

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

まず、反射ベクトルR = 2(Nドット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座標を生成するための最小二乗等角写像アルゴリズムを共有してください。ありがとうございました。

2
DeJean