3

平面上のポイントのUV座標をどのように計算しますか?

ポリゴン(3つまたは4つ以上のポイント)が平面上にあります。つまり、すべてのポイントが平面上にあります。しかし、それは空間内のどの角度でもかまいません。

このポリゴンの片側(2つのポイント)は、テクスチャ内の2つの対応する2Dポイントにマッピングされます。これらの2つのポイントは事前にわかっています。また、テクスチャのxスケールとyスケールも知っており、テクスチャ範囲やその他の「エッジケース」から外れるポイントはありません。

これは、最上部のテクスチャクワッドが歪んでいる画像です。

ここに画像の説明を入力してください

悪いクワッドの輪郭を黄色で示しました。そのクワッドの一番下の2つのコーナーのUV座標を知っていて、他の2つのポイントの適切なUV座標を計算したいとします...

これらの2つのポイントを基準にして、平面内の他のすべてのポイントのUV座標をどのように計算しますか?

私のテクスチャが実際の紙であると想像してください。あなたの(平らな)車のドアにテクスチャを付けたいと思います。紙に2つのドットを配置し、車のドアに2つのドットを並べます。車のドアの他の場所が紙の下にある場所を計算するにはどうすればよいですか?

三辺測量を使用できますか?2D空間の2つの既知の点の擬似コードはどのようになりますか?


brainjamのコードを使用した成功:

def set_texture(self,texture,a_ofs,a,b):
    self.texture = texture
    self.colour = (1,1,1)
    self.texture_coords = tx = []
    A, B = self.m[a_ofs:a_ofs+2]
    for P in self.m:
        if P == A:
            tx.append(a)
        elif P == B:
            tx.append(b)
        else:
            scale = P.distance(A)/B.distance(A)
            theta = (P-A).dot((B-A)/(P.distance(A)*B.distance(A)))
            theta = math.acos(theta)
            x, y = b[0]-a[0], b[1]-a[1]
            x, y = x*math.cos(theta) - y*math.sin(theta), \
                x*math.sin(theta) + y*math.cos(theta)
            x, y = a[0]+ x*scale, a[1]+ y*scale
            tx.append((x,y))

ここに画像の説明を入力してください

4

3 に答える 3

2

他のポイントは、選択した2つのベクトルと原点で表す必要があります。

私はこのようなことをします:

対応するUVポイントを持つ3つの3Dポイントを選択します。

  • A(x、y、z、u、v)
  • B(x、y、z、u、v)
  • C(x、y、z、u、v)

次に、x、y、z座標を使用して、与えられた3D点Dを次のように表現します。

D = A +アルファ(B-A)+ベータ(C-A)+ガンマ(B-A)X(C-A)

x、y、zには3つの方程式があり、Xは外積であり、アルファ、ベータ、ガンマは不明です。これにより、uvとxyzの間に線形関係が作成されます。

W =(B-A)X(C-A)を計算し、解く必要があります:

Dx-Ax = alpha。(Bx-Ax)+ beta。(Cx-Ax)+ gamma.Wx

Dy-Ay = alpha。(By-Ay)+ beta。(Cy-Ay)+gamma.Wy。

Dz-Az = alpha。(Bz-Az)+ beta。(Cz-Az)+ gamma.Wz

この方法で行列Mの逆行列を計算します。

       | (Bx-Ax) , Cx-Ax , Wx | 
   M = | (By-Ay) , Cy-Ay , Wy | 
       | (Bz-Az) , Cz-Az , Wz | 

結果行列をNと呼びますが、Dに依存しないことに注意してください。

次に、Dのアルファ、ベータ、ガンマを次のように計算します。

(アルファ、ベータ、ガンマ)= N.(DA)

次に、Dのu、vを次のように計算します。

Du = Au + alpha(Bu-Au)+ beta(Cu-Au)

Dv = Av + alpha(Bv-Av)+ beta(Cv-Av)

ガンマは、Dと(A、B、C)3D平面の間の距離であるため、使用されません。

于 2011-03-17T22:33:52.643 に答える
1

3Dポリゴンの頂点に、UV座標がわかっている2つの頂点から始めて、反時計回りの順序でラベルを付けます。これらのラベルをABCDと呼びます。UV空間の対応する頂点のラベルは、 abcdです。ここで、abは既知です。

あなたが述べた問題は、元のポリゴンの点Pについて、対応するUV座標pを決定することです。(ポイントCDのUV座標cdの計算だけに関心があると思いますが、 Pの一般的な解は同じです。)

まず、 PABAの間の角度θを計算します。これは、正規化されたベクトルとacosの内積を使用して簡単に実行できます。

α=(PA)⋅(BA)/(| PA || BA |)

θ=acos(α)

また、長さの比率を計算します。

σ=| PA | / | BA |

ここで、UV空間でpを計算するには、ベクトルbaを角度θ(固定したまま)だけ回転させ、σでスケーリングします。

角度θによる回転行列であるRを

| + cos(θ)-sin(θ)|
| + sin(θ)+ cos(θ)|

次に、p = a +σR ba

これで完了です。

于 2011-03-20T16:50:06.637 に答える
0

UとVは0から1までの数字です。

したがって、あなたの状況で、大きい方のエッジのサイズが10で、小さい方のエッジが5であるとすると、各「ギャップ」は2.5になります。次に、これを正規化して、必要な桁を提供します。

したがって、いくつかの擬似コードの例:

bottomLeftVector(0,0,0)
bottomLeftTexture(0,0)
topLeftVector(2.5, 5, 0)
topLeftTexture(0.25, 0)
topRightVector(7.5, 5, 0)
topRightTexture(0, 0.75)
bottomRightVector(10, 0, 0)
bottomRightTexture(1,1)

お役に立てれば!

于 2011-03-17T21:30:10.080 に答える