fractal.jpg


フラクタル正四面体

 「YouTubeの360度動画を生成する」にて、立方体をジェネレータとしたフラクタル物体をご紹介しました。今回はジェネレータを正四面体(tetrahedron)にして作成してみます。

正四面体を作る

 正四面体、と言うのは、4つの面で構成され、全ての面が同じサイズの正三角形になっている物体です。

tetrahedron.png

 図に記入した補助線に従って、一辺の長さ=2×rとした時の以下の長さを求めます。

 頂点Aの座標を決めると、sとhを使って他の頂点B、C、Dを求めることができます。データでは、高さsの方向がz軸の方向と一致し、頂点Dがy軸方向を向いていることとしました。
 すべての頂点座標が計算できたところで、「ラウンドブリリアントカットのダイヤモンド」で作った「三点を含む平面」を定義する手続きを使って4つの面を定義します。

  procedure pla3p $$a,$$b,$$c
  {
    // 三点a,b,cを含む平面を定義する。
    // 法線ベクタは、a→b→cが反時計回りに見える方向を向く
    var ab.x,ab.y,ab.z;
    var ac.x,ac.y,ac.z;
    ab.x=$b.x - $a.x;
    ab.y=$b.y - $a.y;
    ab.z=$b.z - $a.z;
    ac.x=$c.x - $a.x;
    ac.y=$c.y - $a.y;
    ac.z=$c.z - $a.z;
    var n.x,n.y,n.z;
    n.x=ab.y*ac.z - ab.z*ac.y;
    n.y=ab.z*ac.x - ab.x*ac.z;
    n.z=ab.x*ac.y - ab.y*ac.x;
    var l;
    l=sqrt (sq (n.x) + sq (n.y) + sq (n.z));
    // l=0だと、平面にならない。
    if (l=0)
    {
      return;
    }
    n.x=n.x/l;
    n.y=n.y/l;
    n.z=n.z/l;
    plane $a.x,$a.y,$a.z, n.x,n.y,n.z;
  }

 前に作った時には、3点の座標値(x, y, z)をそれぞれ別に、計3×3=9つ引数として引いていましたが、今回はマクロ引数を使って、インターフェイスを簡略化(引数は3つ)してみました。インターフェイスを変えただけで、中身は同じです。「ラウンドブリリアントカットのダイヤモンド」で作ったものと見比べてみてください。

正四面体の自己相似物体

 立体で説明するのは難しいので、平面の三角形で説明します。

recursive.png

 上図に示したように、レベルnの図形を縮小してレベルn+1の部分に使っていきます(自己相似図形、フラクタル)。この様な自己相似図形を定義するのには、再帰呼び出し(ある手続きから、自分自身の手続きを呼び出す)を使うのが楽です。
 以下の様に、フラクタル正四面体を定義する手続きでは、level=0になった時に初めて手続きpla3pを呼び出して正四面体を定義していますが、その他のレベル(level>0)では、自分自身の手続きftetraを4回呼び出して終わりになっています。

  procedure ftetra l,m,n, r, level
  {
    :
    :
    if (level≦0)
    {
      // レベル0のtetrahedronを作成
      and
      {
        pla3p a,d,b;
        pla3p a,b,c;
        pla3p a,c,d;
        pla3p b,d,c;
      }
    }
    else
    {
      // レベルnのtetrahedronを作成
      ftetra a.x,a.y,a.z, 1/2*r, level - 1;
      ftetra (a.x + b.x)/2,(a.y + b.y)/2,(a.z + b.z)/2, 1/2*r, level - 1;
      ftetra (a.x + c.x)/2,(a.y + c.y)/2,(a.z + c.z)/2, 1/2*r, level - 1;
      ftetra (a.x + d.x)/2,(a.y + d.y)/2,(a.z + d.z)/2, 1/2*r, level - 1;
    }
  }

 自分自身を呼び出すときに、levelをデクリメント、サイズを縮小(1/2*r)して再帰呼び出し(×4回)していますので、「自分自身の中に縮小した自分自身が4つあらわれる」、自己相似図形が出来上がるのです。


完成動画

 完成したデータと動画です。

Xi-TRACEデータ fractal_tetrah.xitr

 データ先頭付近のenb360と言う変数をtrueに設定した場合と、falseに設定した場合で少し異なる動画になります。

 まず、enb360=falseの場合、再帰レベル0〜6まで変化させながら、フラクタル正四面体の周りをぐるりと一周します。再帰レベルは不連続のため、時間がたつとパッと切り替わりますが……。だんだん自己相似図形が細かくなっていくのをご覧ください。



 enb360=trueとした場合は、360度VR動画を生成します。左右の動画に視差がついて立体視(ステレオ3D)になっていますので、Cardboardでの視聴を推奨します。Cardboardについては、「YouTubeのCardboardで360度3D動画を鑑賞する」をご覧ください。



 データでは、フラクタル正四面体の一辺の長さを2×10=20と設定してあります。これを×10倍して20×10=200cmと想定し、「一辺2mのオブジェの中に人間が入り込んで周り(360°)を眺める」、設定としました。具体的には、データ中のstereo3d命令の辺りをご覧ください。

※動画変換をミスっていたので、VR動画を再upしましたm(1__)m

 いつもは、Xi-TRACEで生成したAVI(Motion-JPEG)の状態で編集した後、MicrosoftのMovie Makerで音声(WAVファイル)を追加した上、MP4に変換して、YouTubeにアップロードしています。今回も、ついうっかり同じことをしてしまいました……。Movie Makerでセーブすると、どうも1,920×1,080ドットに調整されてしまうらしく、元の画像サイズ(2,048×2,048ドット)やアスペクトサイズ(1:1)が破壊されていました。これが失敗の原因。
 そうでした。だから、「YouTubeの360度動画を生成する」で紹介したように、XMedia Recodeというソフトウェアを使ったのでした。今回、改めて変換を実施したところ、XMedia Recodeを使っても、画像サイズは1,920×1,080になってしまっていることがわかりました。ただ、左右に黒帯を作ってアスペクトを合わせるMovie Makerと違って、ちゃんとアスペクト比1:1で変換されているので、パッと見、気が付きませんでした。
 ちょっと、YouTubeのガイドと合っていないような気もしますが、アップロードしてみるとちゃんと鑑賞できたので、許容範囲なのかな?……今はこれしか、うまく動画を処理できる方法が無いので、目を瞑ってください。最終的に動画サイズが1,920×1,080になってしまうという事は、だいぶ画質的に苦しいですね。まあ、Cardboardで見ることを前提とするなら、何とか耐えられるかな?


home

download

gallery