夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

ゼロから始めるUnityShader開発 第九章 シアリング行列

本日はCGを理解するにあたって重要な概念である行列についての勉強です。

コンピュータ内では多くのデータをテンソルであらわします。

テンソルとは、多次元配列を意味し、例えば画像データを見てみると、RGBAの四次元であらわされる色チャンネルの集まり(ピクセル)が縦横の配列に並んで一つの画像が構成されています。

このように多次元の配列をテンソルと呼びます。

テンソルの中で0次元配列をスカラー、1次元配列をベクトル、2次元配列を行列と呼びます。

redhologerbera.hatenablog.com

コンピュータグラフィックスでは座標変換で多く行列が用いられており以前は回転行列や平行移動行列についてみていきました。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

〇シアリング行列とは?

シアリングとは物理学や工学の分野で使用される用語で、オブジェクトの形状を変えずに一方の面を固定し、他方の面へ平行移動させる操作を意味します。

シアリング行列はオブジェクトをある方向に引き延ばす際に用いられる座標変換になります。

せん断行列とも呼ばれています。

回転行列や平行移動行列に比べると直感的理解がやや難しくなってきますが、例えば建物の壁にポスターを張ることを考えるさい、ポスターを壁の角度に合わせてゆがませる必要があります。

一般的な建物の場合壁単体で見ると床に対して垂直でありゆがみが生じないかもしれませんが、ではポスターをスロープ(坂)に張り付けるとします。

この時ポスターの底面を固定した状態で張り付ける場合はゆがみが生じます。

このようなオブジェクトの形状を適切に変換して視覚的な歪みを補正するためにシアリング行列は用いられています。

シアリング行列は次のように定義されます。

 \displaystyle 
A=
\begin{bmatrix}
1 & S_{xy} & S_{xz} & 0 \\
S_{yx} & 1 & S_{yz} & 0 \\
S_{zx} & S_{zy} & 1 & 0 \\
0 & 0 & 0 & 1\\
\end{bmatrix} 
  \

ここで

 \displaystyle 
S_{xy} \\ 
S_{xz} \\
S_{yx} \\
S_{yz} \\
S_{zx} \\
S_{zy}
\

はシアリング係数と呼ばれる値です。

これらの値によってどの程度傾斜するかが決まります。

例えば、S_xyはX軸に沿ってY方向に傾斜させる割合を意味しています。 同様にS_xzはX軸に沿ってZ方向に傾斜させる割合を意味しています。

シアリング行列を各成分で表すと次のようになります。

・X軸に平行な面をy軸の方向にシアリングする量

 \displaystyle 
\ x' = x + S_{xy} \cdot y 
  \

・x軸に平行な面をz軸の方向にシアリングする量

 \displaystyle 
\ x' = x + S_{xz} \cdot z
  \

・y軸に平行な面をx軸の方向にシアリングする量

 \displaystyle 
\y' = y + S_{yx} \cdot x
  \

・ y軸に平行な面をz軸の方向にシアリングする量

 \displaystyle 
\y' = y + S_{yx} \cdot x
  \

・z軸に平行な面をx軸の方向にシアリングする量

 \displaystyle 
\z' = z + S_{zx} \cdot x 
  \

・z軸に平行な面をy軸の方向にシアリングする量

 \displaystyle 
\z' = z + S_{zy} \cdot y
  \

〇シアリング行列を使用する例

ポスターの例を上げましたが、それ以外の例も出してみます。

例えばある本の開いた状態のページを考えます。

このページは平面上にあり、左右のページが少しずつ重なっています。読者が左右にページをめくる際に、ページの開いた状態をシミュレーションするためにシアリング行列を使用することができます。

具体的には、開かれたページの左側と右側のページは、それぞれ平面上に存在します。これらのページは、一方のページをもう一方のページに対して少しずつシアリングすることで、開いた状態を表現します。このとき、シアリング行列の適切なパラメータを調整することで、ページが開いているように見せることができます。

具体的な計算方法としては、以下の手順を考えることができます

①左側のページの頂点座標を持つリストと、右側のページの頂点座標を持つリストを用意します。

②シアリング行列を用いて左側のページを右側のページにシアリングします。この際、シアリング行列のパラメータは開いた状態に合わせて調整されます。

③シアリングが適用された左側のページの頂点座標を取得し、ページを開いた状態で表示します。

以上がシアリング行列についての説明になります。

本日は以上です。