CDR6275

Michio SHIRAISHI Official Site


OpenGL 4.1とOpenGL ES SL 1.0で学ぶ3次元コンピュータグラフィックス

東邦大学理学部情報科学科 白石路雄
最終更新: 2014年2月20日

4. モデリング変換

4.3 合成変換 (MultipliedModelMatrix)

 前回の結果の画像を見てみると、初音ミクさんが上半分に表示されています。これを中心に持っていくことを考えてみます。

 そのためには、まず初音ミクさんの身長を測ります。これは、モデルの各頂点の中で\(y\)座標が最大のものを選びます。これを\(y_{\text{max}}\)とします(\(y\)の最小値は0になっています)。そこで、次の順に変換を行うことを考えます。

  1. 最初にモデルのそれぞれの頂点の\(y\)座標を、\(-\frac{y_{\text{max}}}{2}\)だけ平行移動する
  2. それぞれの頂点の座標を0.07倍する

 このように複数の変換を組み合わせた変換を合成変換と呼びます。

 ここで、1の平行移動変換を表す行列を\(M_t\)として、2の拡大縮小変換を\(M_s\)とすると、3次元モデルの座標系における座標\((x,y,z)\)から、描画の際に使用する座標系における座標\((x^\prime,y^\prime,z^\prime)\)への変換は、次の式で表せます。

\[
\begin{pmatrix}
x^\prime \\
y^\prime \\
z^\prime \\
1
\end{pmatrix}
=
M_s M_t
\begin{pmatrix}
x \\
y \\
z \\
1
\end{pmatrix}
\]

 ここで注意していただきたいのは、変換の順番が「平行移動変換→拡大縮小変換」となっていますが、数式で表すと左から「拡大縮小変換を表す行列」「平行移動変換」という順に並んでおり、つまり、逆に並んでいるという点です。したがって、合成変換を適用するには、やりたい変換の順の逆に行列を作っていく必要があります。

コードでは以下のようになります。

  Matrix::setIdentityM(modelMatrix, 0);
  Matrix::scaleM(modelMatrix, 0, 0.07f, 0.07f, 0.07f);
  Matrix::translateM(modelMatrix, 0, 0.0f, -maxHeight/2.0f, 0.0f);