2013-09-06 16 views
5

私は[x0, y0, z0]で定義される3dポイントを持っています。平面上の3D点をUV座標に変換するにはどうすればいいですか?

このポイントは、[a, b, c, d]で定義されるプレーンに属します。

normal = [a, b, c]、そしてax + by + cz + d = 0

どのように変換するか(u,v)座標の対に3D点をマッピングすることができますか?

これは本当にシンプルなものでなければなりませんが、わかりません。

+0

ジェネリック(u、v)座標についてお話ししていますか?または、ワールド空間のポイントを三角形上に定義されたテクスチャ座標にマップしようとしていますか? – sbabbi

+0

私は平面をテクスチャ化したい – tigrou

答えて

8

まず、uvベクターを計算する必要があります。 uvは、あなたの飛行機の法線と直交し、互いに直交していなければなりません。そこにそれらを定義するための全くユニークな方法はありませんが、便利かつ迅速な方法は、このようなものになることがあります。

n = [a, b, c] 
u = normalize([b, -a, 0]) // Assuming that a != 0 and b != 0, otherwise use c. 
v = cross(n, u) // If n was normalized, v is already normalized. Otherwise normalize it. 

今、単純な内積を行います。これが原点と仮定していること

u_coord = dot(u,[x0 y0 z0]) 
v_coord = dot(v,[x0 y0 z0]) 

お知らせuv座標の座標は世界起点(0,0,0)です。

ベクトル[x0 y0 z0]が平面上に正確に位置していなくても、これは機能します。そうであれば、飛行機に投影するだけです。 ...あなたは、座標(U、V)の面で、平面内の任意の点の座標を見つけたい

を想定し         

+0

1つの質問: 't'ベクトルで何をしますか?' v_coord'を計算すると、 'v'ベクトルはどこから来ましたか? – tigrou

+0

@tigrou、申し訳ありませんが、 't'に' v'を書きました。編集 – sbabbi

+0

私は、コメントを入れる前に 'v'と' t'の置換を試みましたが、うまくいきませんでしたが、実際の理由は私のプログラムでは間違っていました。私はこれを修正し、それは働いた。ありがとう – tigrou

3

ポイントの場合は、[X0、Y0、Z0]

dot([a,b,c],[x0,y0,z0]) = -d 

ここでdotは2つのベクトル間のドット積です。これは単純に平面方程式を書き換えることです。

トリックは、平面部分空間にまたがる2つのベクトルを見つけることです。これを行うには、長さ3のランダムなベクトルを選択します。それをV0と呼びます。平面法線ベクトルと呼ぶ

N = [a,b,c] 

次に、法線ベクトルNとV0との外積を使用します。我々は非常に不運だったとNとV0が同一直線上だった場合を除き

V1 = cross(N,V0) 

このベクターは、法線ベクトルに直交することになります。その場合、単純に別のランダムベクトルV0を選択します。 2つのベクトルが同一直線上にあるかどうかを知ることができます。なぜなら、V1はベクトル[0 0 0]になるからです。

したがって、V1がゼロベクトルでない場合、各要素をV1のノルムで除算します。ベクトルのノルムは、単純に要素の二乗の和の平方根になります。

V1 = V1/norm(V1) 

次に、NとV1の両方に直交する第2のベクトルV2を選択します。ここでもまた、ベクトル交差積はこれを自明に行う。そのベクトルを単位長さに正規化する。 (V1が単位ノルムを持つベクトルであることを知っているので、ノルム(N)で除算することができます。)

平面内の任意の点は、現在(U、V)、などの関数として自明に記述することができる
V2 = cross(N,V1) 
V2 = V2/norm(V2) 

[x0,y0,z0] + u*V1 + v*V2 

例えば、(U、V)=(0、 0)、明らかに[x0、y0、z0]を返すので、その点を(u、v)座標の「原点」と考えることができます。

同様に、平面内にあることが知られている任意の点[x、y、z]からuとvを復元するか、平面にない点の法線投影を見つけることができますその平面に投影される。

関連する問題