忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

Orthogonal宇宙の「凍りついた、不変の」宇宙を作った時の考え方

私は以前、SF小説『クロックワーク・ロケット』の舞台となった宇宙のシミュレーションプログラムを作りました。
DartをJavaScriptにコンパイルしたものなので死ぬほど重いですが。

『クロックワーク・ロケット』(グレッグ・イーガン)のシミュレーション?

このシミュレーションはある意味インチキで、その理由の一つに「シミュレーションとは名ばかりの、重要なデータを人力で作り入力したものだ」、というものがあります。
いわばアニメーションを予め人力で作って、再生しているだけのようなプログラムです。
シミュレーションを名乗るからにはそのアニメーションに相当するデータをCPUによる計算で作ってほしいものです。

この記事では、どのようにその「重要なデータ」を作り出したのかについて述べます。
ここで言う「重要なデータ」とは宇宙の全歴史のデータです。
物体がどのように動き振る舞うのか。
もしこの作り出し方が間違っていたらすべてがおじゃんで恥ずかしいのですが・・・。


凍りついた、不変の宇宙

このシミュレーションは宇宙の時空を3次元トーラスだと考えます。
右に真っ直ぐ進めば、左から出てきます。
上にまっすぐ進めば、下から出てきます。
未来にまっすぐ進めば、過去から出てきます。
(Orthogonal宇宙では時間も空間も同じなのです)

まあトーラスだと時間の矢などの関係でまずいっぽいので、すでにここからして間違っているのですが。
三部作の1巻では宇宙はトーラスだと推測されていましたが、3作目で宇宙の本当のトポロジーが明かされます。

まあトーラスなのは見逃してください。
トーラスで精一杯でした。
小説では4次元なのにこのシミュレーションは3次元ですし、色々単純化を行っているのです。
本質は、時間も空間も同じだという一点です。

時間と空間が同じなので、上手くシミュレートしようと思ったら、まずひとつの宇宙全体のデータを作り出し、それを切って切り口を動かすことによって時間を進めていくことになります。
もんだいは、どのようにして宇宙全体の(過去も未来も含めた)全データを創りだすのか、ということですね。

静止した図形の問題

私はこの問題を、純粋な図形の問題だと考えました。
物が動いてぶつかって反発するという考えを捨てました。
衝突した物体の間に反発力が生じて速度が変わり位置も変わる、という発想は捨てたのです。
宇宙は凍りついていて不変なのです。
ならば、「不変の3次元トーラスの中に閉じた世界線がどのように配置されるか」、という問題について考えるべきです。
(という発言をイーガンさんが見たら怒りそうですが)

もうちょっと詳しく見て行きましょう。

一定の速度の物体

3次元の宇宙は2つの空間軸と一つの時間軸を持ちます。
もし2次元空間の中を2次元の丸い物体が動いたとしたら、時間も含めた3次元宇宙では3次元のチューブに見えるでしょう。
まっすぐなストローを想像してください。
世界線(世界体積?)というやつですね。

物体の速度の変化

そして2次元空間の中で物体が途中で(何かにぶつかって)速度を変えるというのは、その3次元チューブがある場所で折れ曲がっていることを意味します。
途中で折れ曲がったストローを想像してください。
口付近で曲げて飲みやすくするストローってよくありますよね。

2つの物体の衝突

2次元空間内で2つの物体が衝突するというのは、3次元チューブ同士が、折れ曲がったところ同士で触れ合っているということを意味します。
折れ曲がった2つのストローが、そのちょうど折れ曲がったところでお互いに接触している所を想像してください。
カップル用の飲み物に付いている2つのストローを適当に動かして折れた所をくっつけてください。

閉じた世界線

なお、2次元空間内で物体が(反物質とぶつかっていないのに)消えたりなにもないところからなんの前触れもなく生まれないと仮定した場合(これはそんなに悪くない仮定だと思います)、その3次元チューブはトーラスの中で輪になっている必要があります。
最も単純なのは、トーラスの中をまっすぐ貫くストローです。
上から出て行って、下から出てくる、一周したストローです。
どこも曲がっている必要はありません。

最も単純なのは折れ目のない3次元チューブですが、もうちょっと複雑な、3回折れてトライアングルの形になったチューブや、4回折れた四角形のチューブ、6回折れた六角形のチューブもありえるでしょう。


なんとなく充填問題っぽいですね。
つまり時間軸も含めた凍りついた宇宙空間を、閉じた世界線の作る図形で埋めろというわけです。
運動量保存とかエネルギー保存とか世界線が閉じている必要性などもあって、すべての充填問題の答えが使えるわけではありませんが。

運動量保存、エネルギー保存

3次元チューブと3次元チューブが接している場所の、4本のチューブの角度は、なんでもいいというわけではありません。
いかなる時間軸から見ても、運動量とエネルギーが保存していなければならないのです。
(Orthogonal宇宙の運動量とエネルギーの式はこっちとは違います)
まあ「いかなる」といってもひとつの時間軸でチェックすればそれでOKな式があるので実際は時間軸は適当に選んで大丈夫です。

なんとなく制約充足問題っぽいですね。

ストローはどう折れる?

当時、私はここらへんまで考えてもうくたくたになりました。
なので、ストローが折れているところの形についてまともに考察する気力は残っていませんでした。
(と、言い訳しておきます)
ここまであまり考えてきていませんでしたが、物体が描く世界線(世界体積)は、衝突する場所でどのような形になるのでしょう

折れている場所はとがっているのでしょうか?
それとも丸いのでしょうか?
それとも何か別の形なのでしょうか?

こういう場合本来は、物体を大きさを持ったひとつの分割できない塊としてではなく、点が大量に集まったものとして考えてみるなど他の角度から考えて突破口を開くべきなのでしょう。

しかし完全に考える力を失った私は(今も回想していてつかれました)、もうめんどくさいし丸でいいやと考え、本物のストローのように、折れた場所は丸くしました。
今振り返るとこの判断は軽率だったように思えてなりません。

拍手[0回]

PR