はじめに
3DCG ソフトウェアにおいて、UV 座標系は統一性が無い。
多くの環境は原点が左上か左下に位置しており、バラバラである。
したがってソフトウェア間で 3DCG データを移動するには、UV 座標の変換が必要になることがある。
ここでは UV 座標そのもの、そしてそれに関連するパラメタ Scale と Offset の変換方法について述べる。
結論
- 左上原点と左下原点の UV 座標系の間で変換する場合
- U 座標は無変換で良い
- V 座標は $1 - v$ で求まる
- Scale パラメタは無変換で良い
- U 軸に関する Offset パラメタは無変換で良い
- V 軸に関する Offset パラメタは $1 - \mbox{scale}_v - \mbox{offset}_v $ で求まる
UV 座標の変換
左上原点の UV 座標系の UV 座標を $(U_{t}, V_{t})$ としたときに
それに対応する左下原点の UV 座標系の UV 座標を $(U_{b}, V_{b})$ とする。
このとき、UV 座標変換はこのように行えばよい。
\begin{eqnarray}
U_{b} &=& U_{t} \\
V_{b} &=& 1 - V_{t}
\end{eqnarray}
つまりまず、U 座標に関しては無変換でよい。
そして V 座標に関しては、反転させて 1 を加算すればよい。
また逆に、左下原点から左上原点に変換するときも同様の式で求まる。
UV Scale/Offset パラメータの変換
ではここで、一般に UV 座標に付随して定義される Scale および Offset の値はどう変換すればいいだろうか?
Scale と Offset は次のように定義される。
ある頂点の UV 座標を $(U_{m}, V_{m})$ とする。
また Scale $(S_u, S_v)$ および Offset $(O_u, O_v)$ とする。
このとき最終的に求められる UV 座標 $(U, V)$ は以下のように定義できる。
\begin{eqnarray}
U &=& U_m S_u + O_u \\
V &=& V_m S_v + O_v
\end{eqnarray}
ここで前節から、U 座標に関しては無変換でよい。
では V 座標はどうだろうか?
まず入力となる左上原点の UV 座標系を持つソフトウェア上での値を次のように定義する。
最終的に求まる UV 座標系の V 座標を $V_t$ とする。
メッシュ頂点 UV の V 座標を $M_t$ とする。
スケールの V 軸パラメタを $S_t$ とする。
オフセットの V 軸パラメタを $O_t$ とする。
同様に返還後の出力となる左下原点の UV 座標系を持つソフトウェア上での値を次のように定義する。
最終的に求まる UV 座標系の V 座標を $V_b$ とする。
メッシュ頂点 UV の V 座標を $M_b$ とする。
スケールの V 軸パラメタを $S_b$ とする。
オフセットの V 軸パラメタを $O_b$ とする。
このとき、これらのパラメタは以下を満たせばよい。
\begin{cases}
V_b &= 1 - V_t \\
M_b &= 1 - M_t \\
S_b &= S_t \\
V_t &= M_t S_t + O_t \\
V_b &= M_b S_b + O_b \\
\end{cases}
これらを代入して式変形していくと以下のように計算できる。
\begin{align}
V_b &= 1 - V_t \\
M_b S_b + O_b &= 1 - (M_t S_t + O_t) \\
M_b S_t + O_b &= 1 - (M_t S_t + O_t) \\
M_b S_t + O_b &= 1 - ((1 - M_b) S_t + O_t) \\
M_b S_t + O_b &= 1 - (1 - M_b) S_t - O_t \\
M_b S_t + O_b &= 1 - S_b + M_b S_t - O_t \\
O_b &= 1 - S_t - O_t \\
\end{align}
したがってオフセットの V 軸パラメタは $1 - S_t - O_t$ で求まる。