「YouTubeの360度動画を生成する」にて、立方体をジェネレータとしたフラクタル物体をご紹介しました。今回はジェネレータを正四面体(tetrahedron)にして作成してみます。
正四面体、と言うのは、4つの面で構成され、全ての面が同じサイズの正三角形になっている物体です。
図に記入した補助線に従って、一辺の長さ=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つ)してみました。インターフェイスを変えただけで、中身は同じです。「ラウンドブリリアントカットのダイヤモンド」で作ったものと見比べてみてください。
立体で説明するのは難しいので、平面の三角形で説明します。
上図に示したように、レベル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命令の辺りをご覧ください。
いつもは、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で見ることを前提とするなら、何とか耐えられるかな?