「4次元図形のAR投影」

2019年制作/使用ソフト:Unity,Xcode,Processing,Photoshop/対応デバイス:iOS13以降を搭載した端末

これは高専在学時代、その卒業研究の一環として制作したアプリケーションだ。(動画では編入後にアップデートした作品を使用。)

空間という概念に私は幼いころから強烈な興味があった。私たちがいるとされる3次元とはなんだろう、時間は次元なのだろうか、宇宙の根源はなんだろう、空間そのものはどのような存在なのか、私たちは4次元にいけるのか。幼いころからそれらを考えると、私はバカンス旅行を計画しているかのような興奮に包まれた。高専に入り数学と触れ合ったとき、その感情は極まった。特に線形代数や行列計算を学んだとき次元という存在を数量的に表せることを知り、まだ見ぬ可能性を覚えた。

ある時、趣味の写真を撮っていて、こんな疑問を持った。「4次元を3次元に投影できるのではないか」と。つまり、写真が立体(3次元物体)を平面(2次元)に投影できるように、4次元物体も3次元空間に写せるのではないかと考えた。

その疑問を自ら解決するために4次元について研究した。まず4次元と聞くと、空想の産物のように聞こえるが、実際はそうではなく、非常に単純なものである。ここではその4次元という奥深いものを想像できるようになるために簡単にかいつまんで紹介する。

そもそも次元とは?

1次元は線で、それが連続すると2次元(平面)になり、それが連続すると3次元になる。それを連続させたものが4次元である。ただ、3次元を連続といってもあまりピンとこないと思う。そこでそれぞれの次元の基本図形、例えば2次元の基本図形は正方形、三次元は正立方体などそれぞれの規則性について考える。

上記図のような規則性から、4次元図形は16の頂点があると考えられる。また、立方体が平面へにする展開図を描けるように、4次元立方体も立方体の展開図を構成できることが想像できる。

座標を定義

このことから、4次元図形がどのようなものか想像できるので、それぞれの頂点に以下のような4行の配列を持たせ4次元座標定義した。

  points[0] =  new P4Vector(-1, -1, -1, 1);
  points[1] =  new P4Vector(1, -1, -1, 1);
  points[2] =  new P4Vector(1, 1, -1, 1);
  points[3] =  new P4Vector(-1, 1, -1, 1);
  points[4] =  new P4Vector(-1, -1, 1, 1);
  points[5] =  new P4Vector(1, -1, 1, 1);
  points[6] =  new P4Vector(1, 1, 1, 1);
  points[7] =  new P4Vector(-1, 1, 1, 1);

  points[8] =  new P4Vector(-1, -1, -1, -1);
  points[9] =  new P4Vector(1, -1, -1, -1);
  points[10] = new P4Vector(1, 1, -1, -1);
  points[11] = new P4Vector(-1, 1, -1, -1);
  points[12] = new P4Vector(-1, -1, 1, -1);
  points[13] = new P4Vector(1, -1, 1, -1);
  points[14] = new P4Vector(1, 1, 1, -1);
  points[15] = new P4Vector(-1, 1, 1, -1);

次に、3次元座標を2次元座標に投影する方法を考える。最も簡単なレンダラーの手法が以下のような行列式であることが知られている。

この式を応用し4次元座標を3次元座標で表現する。

実際には、これでは遠近感を表現できないため、観測者側から見て遠い座標は中心に近づける関数を作った。

作図してみる

頂点に処理を行うと以下のような画像が作成できた。これが正面から見た4次元図形である。

正面からみた4次元図形

回してみる

ただ正面から見ただけではまだよくわからないので、この図形を回転させて見渡したい。原点を中心として座標の回転を表現させるには二次元の場合以下のような回転行列を使用すればよい。

    \[R(\theta)= \left(\begin{array}{cc}\cos\theta & -\sin\theta \\\sin\theta & \cos\theta\end{array}\right)\]

これを4次元に置き換えるが、一つ留意しなければいけないことがある。それは4次元には回転方向が6つあるということだ。というのも回転とは2つの軸を入れ替えることで、つまり2次元では軸の組み合わせが2C2=1であるから、回転方向は[x軸とy軸]の回転の1つしかない。3次元の場合はでは軸の組み合わせが3C2=3なので[x軸とy軸]、[x軸とz軸]、[y軸とz軸]の3つの回転方向がある。4次元の場合は4C2=6の6つの組み合わせがあることがわかる。

これらことから、4次元での回転をするための式が以下のようにできた。

    \[R_{xy}(\theta)= \left(\begin{array}{cccc}\cos\theta & -\sin\theta & 0 & 0 \\sin\theta & \cos\theta & 0 & 0\0 & 0 & 1 & 0\0 & 0 & 0 & 1\end{array}\right)\]

    \[R_{xz}(\theta)= \left(     \begin{array}{cccc}       \cos\theta & 0 & -\sin\theta  & 0 \\       0 & 1  & 0 & 0\\       \sin\theta & 0 & \cos\theta & 0\\       0 & 0 & 0 & 1     \end{array}         \right)\]

    \[R_{xw}(\theta)= \left(     \begin{array}{cccc}       \cos\theta & 0 & 0  & -\sin\theta \\       0 & 1  & 0 & 0\\       0 & 0 & 1 & 0\\       \sin\theta & 0 & 0 & \cos\theta     \end{array}         \right)\]

    \[R_{yz}(\theta)= \left(     \begin{array}{cccc}       1 & 0 & 0  & 0 \\       0 & \cos\theta  & -\sin\theta & 0\\       0 & \sin\theta &  \cos\theta & 0\\       0 & 0 & 0 &1     \end{array}         \right)\]

    \[R_{wy}(\theta)= \left(     \begin{array}{cccc}       1 & 0 & 0  & 0 \\       0 & \cos\theta  & 0 & -\sin\theta\\     0 & 0 & 1 &0\\       0 & \sin\theta & 0 &  \cos\theta      \end{array}         \right)\]

    \[R_{wz}(\theta)= \left(     \begin{array}{cccc}       1 & 0 & 0  & 0 \\         0 & 1 & 0 &0\\       0 &  0 & \cos\theta  & -\sin\theta\\       0 &  0 & \sin\theta &  \cos\theta      \end{array}         \right)\]

これらの処理を行うことで以下のように4次元図形を回転させることができた。

ここでは簡単に4次元とはどのようなものか解説してみた。これをARで投影するとモニターだけでは分かりづらい4次元図形を3次元的に見て回れる。

制作:伊藤銀児

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

©GINJI ITO. All rights rserved.