三角ポリゴンへのタイルマッピング

三角ポリゴンの頂点を順に$a,b,c$とすると、レイとポリゴンの交差判定時に$e_1 = b-a$、$e_2 = c-a$を用いて、$p = a + ue_1 + ve_2$となる$u,v$を求めてあるので、これを用いてテクスチャマッピングを行うことを考える。しかし、$e_1,e_2$は直交するとは限らないのでこれを用いるとテクスチャが歪んでしまう。そこでこの$uv$座標空間の基底$(e_1,e_2)$の座標$(u,v)$を適当な直交座標に変換する必要がある。直交座標系の$u’v’$座標空間の基底$(e_1’,e_2’)$をポリゴンの法線ベクトル$n$を用いて次のように設定する。しかし、基準が法線ベクトルしか無いと向きが定まらないので、ローカル座標またはワールド座標の$x$軸方向の単位ベクトルをもう一つの基準に設定する。

$$e_1’ = n \times axis_x$$
$$e_2’ = e_1’ \times n$$

基底変換行列$P_{uv \rightarrow u’v’}$は定義より、
$$
(e_1’,e_2’,n) = (e_1,e_2,n)P_{uv \rightarrow u’v’}
$$
を満たすから、行列
$$
\begin{bmatrix}
e_1’ & e_2’ & n & e_1 & e_2 & n
\end{bmatrix}
$$
を簡約化し、$normal$方向の値は必要ないので、$(1,4)$から$(2,5)$を$2\times2$行列の$P_{uv \rightarrow u’v’}$とする。

この基底変換行列を用いて$uv$座標をテクスチャ座標に変換する式は次のように書ける。ただし、$w,h$はテクスチャの幅と高さ、$r_x,r_y$はテクスチャの繰り返し回数、$\theta$は回転角である。

$$
T’ = [ a ]_{texture}’ = \begin{bmatrix}
w & 0 \\
0 & h
\end{bmatrix} \begin{bmatrix}
r_x & 0 \\
0 & r_y
\end{bmatrix}\begin{bmatrix}
\cos\theta & -\sin\theta \\
\sin\theta & \cos\theta
\end{bmatrix}P_{uv\rightarrow u’v’} [ a ]_{uv}
$$

$T’$はテクスチャの範囲外の値も取るのでこれをテクスチャの範囲内に収める必要がある。これは次の式で行う。

$$
T_x = T_x’ - w \left\lfloor \frac{T_x’}{w} \right\rfloor
$$
$$
T_y = T_y’ - h \left\lfloor \frac{T_y’}{h} \right\rfloor
$$

したがって、ポリゴン内の座標$(u,v)$の物体の色はテクスチャの座標$T$の色を用いれば良い。

タイルマッピング
タイルマッピング

三角ポリゴンへのUVマッピング

上記と同様の理由により、直交座標系での座標に変換する必要がある。そこで基底変換行列$P_{uv \rightarrow u’v’}$を三角ポリゴンへのタイルマッピングと同様に求めるが、ここでは簡約化した行列の$(1,4)$から$(3,6)$を$3\times3$行列の基底変換行列$P_{uv \rightarrow u’v’}$とする。

この基底変換行列を用いると
$$
[ a ]_{u’v’} = P_{u’v’ \rightarrow uv} [ a ]_{uv}
$$
により、直交座標系に変換できる。

次にこの座標とテクスチャ座標を対応付ける必要がある。四角形のマッピングならばテクスチャを投影変換をする必要があるが、今回は三角形なのでアフィン変換で十分である。ポリゴンの3点に対応するテクスチャ上の点3点を予め指定しているとする。この変換前後の3点からアフィン変換行列$A$を求める。

アフィン変換行列$A$は以下の$a,b,c,d,e,f$の場所にのみ有効な値を取るので、3行目は以下のように固定できる。
$$
A = \begin{bmatrix}
a & b & c \\
d & e & f \\
0 & 0 & 1
\end{bmatrix}
$$

変換前のテクスチャ座標を$(x_i,y_i)(i = 0,1,2)$、変換後の$u’v’$座標空間の座標を$(x_i’,y_i’)(i = 0,1,2)$とする。アフィン変換の定義より以下の式を満たす。
$$
\begin{bmatrix}
x_0’ & x_1’ & x_2’ \\
y_0’ & y_1’ & y_2’ \\
1 & 1 & 1
\end{bmatrix} = \begin{bmatrix}
a & b & c \\
d & e & f \\
0 & 0 & 1
\end{bmatrix} \begin{bmatrix}
x_0 & x_1 & x_2 \\
y_0 & y_1 & y_2 \\
1 & 1 & 1
\end{bmatrix}
$$

この式を整理して
$$
\begin{bmatrix}
x_0 & y_0 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & x_0 & y_0 & 1 \\
x_1 & y_1 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & x_1 & y_1 & 1 \\
x_2 & y_2 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & x_2 & y_2 & 1
\end{bmatrix} \begin{bmatrix}
a \\ b \\ c \\ d \\ e \\ f
\end{bmatrix} = \begin{bmatrix}
x_0’ \\ y_0 ‘ \\
x_1’ \\ y_1 ‘ \\
x_2’ \\ y_2 ‘
\end{bmatrix}
$$
となる。よって$a,b,c,d,e,f$を求めるにはこの式を簡約化によって解けば良いことになる。

すると、アフィン変換逆行列$A^{-1}$を利用して、テクスチャ座標は次のように求められる。

$$
[ a ]_{texture} = A^{-1} P_{u’v’ \rightarrow uv} [ a ]_{uv}
$$

したがって、ポリゴン内の座標$(u,v)$の物体の色はテクスチャの座標$[ a ]_{texture}$の色を用いれば良い。

UVマッピング
UVマッピング