動画の解説を参照
CGツールなどで作成したモデルは3次元的につくられているため、それを構成するポリゴンの頂点は \(x, y, z\) の3つの座標を持ちます。
一方、それをもとにしてレンダリングした静止画や動画は2次元的な \(x', y'\) の座標を持ちます。
つまり、レンダリングするためには \(x, y, z\) から \(x', y'\) を計算する工程が必要になるということです。
このやり方には
平行投影と
透視投影があります。
平行投影は、単純にモデルの方の \(z\) 座標を無視し、\(x, y\) をそのまま \(x', y'\) にするだけです。
\(x' = x\)
\(y' = y\)
下の図のように、モデルの裏側から平行光線を当ててスクリーンに当たったところの座標を使うイメージです。
※ 準備 : 学籍番号を入れて「入力」をクリック (タップ) してください。
\(A_1\) ~ \(A_8\) を頂点とする、1辺の長さが2の立方体に対し、
- \(y\) 軸を中心に反時計まわりに°回転
- \(x\) 軸を中心に反時計まわりに°回転
- \(z\) 方向に -2平行移動
を順に行ったものを、 \(XY\) 平面に平行投影した座標 (四捨五入して小数第2位までにする) を計算して下のような表を完成させ、それをもとにして図を描いてください。
| 頂点 |
変換前座標 |
投影座標 |
| \(x\) |
\(y\) |
\(z\) |
\(x''\) |
\(y''\) |
| \(A_1\) |
1 |
1 |
1 |
|
|
| \(A_2\) |
1 |
-1 |
1 |
|
|
| \(A_3\) |
-1 |
-1 |
1 |
|
|
| \(A_4\) |
-1 |
1 |
1 |
|
|
| \(A_5\) |
1 |
1 |
-1 |
|
|
| \(A_6\) |
1 |
-1 |
-1 |
|
|
| \(A_7\) |
-1 |
-1 |
-1 |
|
|
| \(A_8\) |
-1 |
1 |
-1 |
|
|
課題用方眼画像
課題1解説
立方体の頂点はどれも同じ変換を受けます。問題文にある3つの変換は、
原点から変換前, 変換後の座標に向かう同次表現のベクトルを \(\boldsymbol{r}\), \(\boldsymbol{r}'\) とすると、
\(\psi=\)
, \(\phi=\)
, \(\boldsymbol{t}=(0, 0, -2)\) として
\(\boldsymbol{r}'\)
\(=\boldsymbol{T}(\boldsymbol{t})\)
\(\boldsymbol{R}_x(\phi)\)
\(\boldsymbol{R}_y(\psi)\)
\(\boldsymbol{r}\)
\(
\begin{pmatrix}
x'\\
y'\\
z'\\
1
\end{pmatrix}
\)
\(
=\begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
0 & 0 & 1 & -2\\
0 & 0 & 0 & 1
\end{pmatrix}
\)
\(
\begin{pmatrix}
1 & 0 & 0 & 0\\
0 & \cos\phi & -\sin\phi & 0\\
0 & \sin\phi & \cos\phi & 0\\
0 & 0 & 0 & 1
\end{pmatrix}
\)
\(
\begin{pmatrix}
\cos\psi & 0 & \sin\psi & 0\\
0 & 1 & 0 & 0\\
-\sin\psi & 0 & \cos\psi & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
\)
\(
\begin{pmatrix}
x\\
y\\
z \\
1
\end{pmatrix}
\)
\(=
\begin{pmatrix}
\cos\psi & 0 & \sin\psi & 0\\
\sin\phi\sin\psi & \cos\phi & -\sin\phi\cos\psi & 0\\
-\cos\phi\sin\psi & \sin\phi & \cos\phi\cos\psi & -2\\
0 & 0 & 0 & 1
\end{pmatrix}
\)
\(
\begin{pmatrix}
x\\
y\\
z \\
1
\end{pmatrix}
\)
なので、2つの回転と平行移動を行ったあとの座標はこうなります。
\(x' = x\cos\psi + z \sin\psi\)
\(y' = x\sin\phi\sin\psi + y\cos\phi -z\sin\phi\cos\psi\)
\(z' = -x\cos\phi\sin\psi + y\sin\phi + z\cos\phi\cos\psi -2\)
これをスクリーンに平行投影した座標 \(x'', y''\) は、結局 \(x', y'\) と同じなのでこうなります。
\(x'' = x\cos\psi + z \sin\psi\)
\(y'' = x\sin\phi\sin\psi + y\cos\phi -z\sin\phi\cos\psi\)
Excelを使った解き方
\(x'', y''\) を求める式には \(\cos\psi\), \(\sin\psi\), \(\cos\phi\), \(\sin\phi\)
が出てくるので、これらの計算式を特定のセルに入れておくと楽になります。
例えばG4セルに入れる式は「=COS(RADIANS(G2))」です。
\(x'' = x\cos\psi + z \sin\psi\)
\(y'' = x\sin\phi\sin\psi + y\cos\phi -z\sin\phi\cos\psi\)
なので、D2, E2セルにそれぞれ
=A2*G4+C2*G5
=A2*G7*G5+B2*G6-C2*G7*G4
と入力すればもとの座標 (1, 1, 1) の変換後の値を計算できますが、そのまま (1, -1, 1) 以降セルのにコピーすると、\(\sin\psi\), \(\cos\psi\), \(\sin\phi\),
\(\cos\phi\) の値が入ったセルの参照位置がずれてしまいます。そこで、ここに入れる式を
=A2*G$4+C2*G$5
=A2*G$7*G$5+B2*G$6-C2*G$7*G$4
としてやれば、D2, E2セルをコピーしてD3~E9セルにペーストするだけですべての頂点の変換後の座標が計算できます。
また、計算した座標のセルについて「セルの書式設定」をこのようにすれば、小数第2位までになるように四捨五入した値が表示されるようになります。
動画の解説を参照
透視投影では、スクリーンをはさんでモデルと逆の側に仮想的なカメラを配置し、ポリゴンの頂点とカメラを結ぶ線分とスクリーンが交わった点の座標を使います。
こうすることで、平行投影とくらべて立体感のある図形になります。
スクリーンを \(XY\)平面とし、原点からカメラの位置に向かうベクトルを \(\boldsymbol{c} = (0, 0, c_z)\) とすると、ポリゴンの頂点 \(\boldsymbol{r} = (x, y, z)\)
に対応するスクリーン上の座標は
\(x' = x \)\(\Large{\frac{c_z}{c_z-z}}\)
\(y' = y \)\(\Large{\frac{c_z}{c_z-z}}\)
となります。
課題1と同じ立方体を考え、同様に回転・移動させたものを、スクリーンが \(XY\)平面で、カメラの座標が \((0, 0, 5)\) の場合に透視投影した座標 (四捨五入して小数第2位までにする)
を計算して下のような表を完成させ、それをもとにして図を描いてください。
| 頂点 |
変換前座標 |
投影座標 |
| \(x\) |
\(y\) |
\(z\) |
\(x''\) |
\(y''\) |
| \(A_1\) |
1 |
1 |
1 |
|
|
| \(A_2\) |
1 |
-1 |
1 |
|
|
| \(A_3\) |
-1 |
-1 |
1 |
|
|
| \(A_4\) |
-1 |
1 |
1 |
|
|
| \(A_5\) |
1 |
1 |
-1 |
|
|
| \(A_6\) |
1 |
-1 |
-1 |
|
|
| \(A_7\) |
-1 |
-1 |
-1 |
|
|
| \(A_8\) |
-1 |
1 |
-1 |
|
|
課題用方眼画像
課題2解説
課題1の立方体を回転・移動させたあとの座標は、前に計算した通り
\(x' = x\cos\psi + z \sin\psi\)
\(y' = x\sin\phi\sin\psi + y\cos\phi -z\sin\phi\cos\psi\)
\(z' = -x\cos\phi\sin\psi + y\sin\phi + z\cos\phi\cos\psi -2\)
です。これをスクリーンに平行投影した座標 \(x'', y''\) は、概要の式で \(c_z = 5\) として以下のようになります。
\(x'' = x'\)
\(\Large{\frac{5}{5-z'}}\)
\(y'' = y'\)
\(\Large{\frac{5}{5-z'}}\)
Excelを使った解き方
こんどは \(x'', y''\) は \(x', y'\) とは異なった値になります。
また、課題1で求めた値に加えて \(z'\) も必要になるので、列を3つ追加してこのようにし、
\(z' = -x\cos\phi\sin\psi + y\sin\phi + z\cos\phi\cos\psi -2\)
F2セルで
=-A2*J$6*J$5+B2*J$7+C2*J$6*J$4-2
としてやれば、(1, 1, 1) を変換した \(z\) 座標が計算できます。あとはこれをF3~F9セルにペーストするだけですべての頂点の変換後の \(z\) 座標が計算できます。
\(x'' = x'\)
\(\Large{\frac{5}{5-z'}}\)
\(y'' = y'\)
\(\Large{\frac{5}{5-z'}}\)
の計算はG2, H2セルでそれぞれ
=D2*5/(5-F2)
=E2*5/(5-F2)
とし、それを G3~H9にコピーするだけです。
課題解答
計算用Excelファイル (Teamsのメンバーのみが見られます。ダウンロードして \(\phi, \psi\) の値を書きかえればそれに応じた計算になります)