![](https://habrastorage.org/getpro/habr/post_images/2d0/ac2/77e/2d0ac277e6f8885ec9d9069212287181.jpg)
記事「JavaScript JavaScriptレイトレーサー」の解説で、その著者ankh1989は、4次元空間のレイトレーサーを作成する計画について話しました。 ここで、このトピックに関する私の考えのいくつかを表現しようとします。
それでは、4次元空間にシーンを作りましょう。 3次元の表面(多面体、球体、円柱など)で構成されており、何らかの方法で塗装されており、反射および散乱能力があります。 平面(2次元)図面に表示したいと思います。
何ができますか? オプションは次のとおりです。
1)シーンの3次元セクションを作成します。 通常の3Dシーンと見なし、3次元空間の法則に従ってレンダリングを実行します。
2)4Dを3Dに投影します(たとえば、平行投影)。 可視の投影点は元の投影点のプロパティを継承すると信じており、再び、3Dレンダリングを実行します。
3)4次元レイトレーシングアルゴリズムを使用して、4Dの3Dへの中央投影を実行します。 ピクセルの3次元配列を取得します。 どういうわけか2Dに投影します。 そのようなオプションがあります:
3a)任意の方向を選択し、この方向に進む各ラインで、最初に塗りつぶされたピクセルを見つけます(平行直交投影)。 このピクセルの色は、最終画像のドットの色を示します。
3b)同じですが、中央投影を使用します。
3c、d)(3a、b)から投影を取得しますが、ラインの最初のピクセルの色を取得する代わりに、ラインに落ちたすべての色を平均します。
最初の2つのアプローチは興味のないものとして破棄します(場合によっては有用かもしれません)。 また、たとえば、オプション3bを検討してください。
![](https://habrastorage.org/getpro/habr/post_images/18f/f6f/08e/18ff6f08e67a9881c413d7af75987279.jpg)
そのため、原点にカメラがあり、Ow =(0,0,0,1)に向けられています。 彼女は(p、q、r)=(x / w、y / w、z / w)で座標(x、y、z、w)でポイントを投影します。 w> 0のポイントのみが表示されます。
2番目のカメラはOr軸(ポイント(0,0、-a))のどこかにある3次元空間にあり、2次元スクリーン上のポイント(u、v)=(p /(a + r)、q /(a + r))。 最初の式から値p、q、rを代入すると、(u、v)=(x /(z + a * w)、y /(z + a * w))が得られます。 つまり、2つの中央の投影ではなく、1つで十分です。カメラを回すだけで十分です。 2番目の投影は、スクリーンとカメラの軸の両方に垂直な軸に沿って直交するため、オプション(3a)と(3b)は同等です。
次に、これらの予測について詳しく見ていきましょう。 特定の平面角度から来る光線に関する情報が画面の各ピクセルに入ることは簡単に理解できます。 そのような光線の1次元セットがあり、それらすべてを取ります(たとえば、それらを平均します-これらはバリアント(3c、d)になるか、ボイドから来ていない光線の1つ、たとえば左端の光線を選択します-これらはバリアント(3a、b )
![](https://habrastorage.org/getpro/habr/post_images/216/b59/370/216b59370a980478f3156bec856d09df.jpg)
「左端の点」のオプションは好きではありませんでした。OL線がオブジェクトに接触し、シーンのシルエットから見ると4次元ビューアーと呼ばれます。 そのため、あまり一般的ではないオプションを試してみることにしました。フラットアングルに落ちたシーンのポイントを考慮し、カメラに最も近いポイントの色を取得します。 このような最も近い点(角度の境界が計算されるとき)は、任意のベースオブジェクトに対してすばやく見つけることができます。その後、そのオブジェクトに対してのみトレースを実行できます。ピクセルごとに1つのトレースが得られます。
どうしたの?
最初に、シーン内のすべてのオブジェクト(カメラを含む)を同じ平面w = 0に配置しました。 当然のことながら、レンダリング結果は3次元と変わりません(品質が悪いだけで、私はあまり努力しませんでした)。
![](https://habrastorage.org/getpro/habr/post_images/4fc/577/55c/4fc57755ca0b781635175d431644e055.jpg)
次に、オブジェクトを移動せずに、カメラを4次元で回転させ始めました。 最初のシフトの後、結果は次のようになりました。
![](https://habrastorage.org/getpro/habr/post_images/754/7cc/e2c/7547cce2cd6457492b14b9a7d970e24c.jpg)
最初に、緑色のボールの影が消え、次に、大きな球体の赤と緑のボールの反射が消えたことがわかります! これは、カメラに最も近い球体の点が異なったためであり、ボールが反射した点ではありません。
さらに、スタンドの形状が変更されました。 平面ではなく、3次元の3Dキューブで構成されていることは明らかです。
![](https://habrastorage.org/getpro/habr/post_images/e52/882/c32/e52882c32b18ca4ef119486e1494ffe9.jpg)
次のターンの後、写真はさらに変化しました。スタンドで2つのボールがdrれ、1つだけが残りました-そして彼は半分浸っていました。
![](https://habrastorage.org/getpro/habr/post_images/1ad/af9/1b4/1adaf91b450daa14c9bf554f0cfb5155.jpg)
そして最後に、開始位置から90度の回転:今、wの方向から見ます。 また、スタンドの片側のサイズが3 * 5になっています。
第二の経験。 カメラを元の場所に戻し、ボールをw方向(異なる方向)に移動します。 大きなボールの赤と緑のボールの反射が消えており、さらに、平面の赤いボールの反射のサイズが急激に減少していることがわかります。
![](https://habrastorage.org/getpro/habr/post_images/0c7/9dd/ec2/0c79ddec26494946319532a87168fda4.jpg)
ターンの後、反射は完全に消えました:
![](https://habrastorage.org/getpro/habr/post_images/84e/671/20f/84e67120fe07cf3a3d7d4d34ff0a1c8f.jpg)
次のシーンでは、新しいオブジェクト-「球形のセクションを持つチューブ」を使用しました。 これらのチューブのうち4つを平面上の異なる方向に配置すると、次のようになります。
![](https://habrastorage.org/getpro/habr/post_images/5a2/496/f74/5a2496f74dd4bb57f86fe9229cdf5e5a.jpg)
フォアグラウンドにある奇妙なオブジェクトは何か、私は理解していませんでした。 私の意見では、これは穴です。 またはプログラムのバグ。
最初のターンの後、反射が消えました:
![](https://habrastorage.org/getpro/habr/post_images/e16/cfe/f11/e16cfef11c603638df4dba65166b8d16.jpg)
そして、2番目のチューブの後、彼らはdr死しましたが、反射が戻りました!
![](https://habrastorage.org/getpro/habr/post_images/2a7/d9e/610/2a7d9e610876978694d0fcef9bfa7c39.jpg)
4番目のシーンは、ボールと球形のチューブで構成されるcost骨のテッセラクトモデルです。 最初のフレームには8個のボールしかありません。互いに閉じているような側面から見てみましょう。
![](https://habrastorage.org/getpro/habr/post_images/5a9/2f7/27d/5a92f727d0416101be6e2f4650fdd8c5.jpg)
飛行機の反射に注意してください。 8つの緑色の球体で構成されています。これらは平面w = 0にあるチューブセクションです。
カメラを回した後、16個の頂点がすべて表示され、球体の反射が予測不能になりました。
![](https://habrastorage.org/getpro/habr/post_images/263/876/491/263876491d64c7d72542ca9219e42c1e.jpg)
次のターンの後、立方体は半分drれました:
![](https://habrastorage.org/getpro/habr/post_images/f8c/e93/051/f8ce930518b7a0b60959f5f70a963d43.jpg)
そして、反対側から現れましたが、鏡球と交差しました:
![](https://habrastorage.org/getpro/habr/post_images/61d/13b/369/61d13b369b1ef92012fa12bf2200c864.jpg)
そして、これは球体のある空間に立方体を置き、その影を見ようとする試みです。
![](https://habrastorage.org/getpro/habr/post_images/bd6/0a8/6fd/bd60a86fd020349d3b1a2a851e2bbc56.jpg)
概して、見るべきものは何もありません。
したがって、選択された投影では、結果はあまり予測可能ではなく、オブジェクトの表面の一部しか見えません-興味深い詳細があれば、それらは私たちから隠されています。 おそらく、より完全な画像を得るには、多くの光線で平均化を使用する必要があります。 角度ごとに100光線で十分であることを願っています。