問題タブ [raytracing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
math - カメラの画面を投写する
単純なレイ トレーサーを作成することで vectormath についてもう少し学ぼうとしており、それについていくつか読んでいますが、見つけることができなかったのは、一次光線の方向を決定する方法です。これは単純な問題のように聞こえますが、おそらくそうかもしれませんが、私の現在の知識では、それを理解することができませんでした.
私は、カメラ (ベクトルとしての位置と方向に過ぎない) が必要であると考え、カメラから、最終的な画像を表すカメラの前のスクリーンに一次光線を発射しました。私が理解できないのは、画面の隅の座標です。画面を知っていれば、一次光線の方向を見つけるのは簡単です。
回転行列を必要としない単純な数学だけを使用して、画面を把握できることを願っています。私の最善の推測はこれです:
カメラの方向をベクトルとして持っています。この方向は、投影スクリーンの平面の法線に等しくなります。したがって、画面の法線があり、そこから画面の中心を簡単に計算できます。
距離は、画面とカメラの間の距離です。しかし、それは私が迷子になる場所であり、カメラの任意の方向の平面のコーナー座標を把握する方法を見つけることができません.
ここで私を助けてくれる人はいますか?そして、私の方法がおそらく機能しない場合、何が機能しますか?
math - 入射角はどのように計算しますか?
CPU 時間を気にせずにリアルなレンダリングを生成することを目標に、大規模なサイド プロジェクトのレイトレーサーに取り組んでいます。基本的にプリレンダリングなので、速度よりも精度を重視しています。
物事の照明の側面で行われている、より高度な数学のいくつかに頭を悩ませています。基本的に、私は自分の光にポイントを持っています。距離減衰がないと仮定すると、見つけたポリゴン上のポイントを使用し、そのポイントの法線をライトへの入射角と比較して、照明値を計算できるはずです。では、平面上のポイント、その平面の法線、およびポイント ライトが与えられた場合、その角度をどのように計算すればよいでしょうか?
私が尋ねる理由は、入射角を見つけることに関する参考文献が見つからないように見えるからです。入手したら何をすべきかを詳しく説明している参考文献はたくさんありますが、そもそも入手方法を教えてくれるものはありません。単純なことだと思いますが、論理的に説明することはできません。
ありがとう
c# - 構造体はいつ答えますか?
私はレイトレーサーの趣味のプロジェクトをやっていて、もともとはベクターオブジェクトとレイオブジェクトに構造体を使用していました。レイトレーサーはそれらを使用するのに最適な状況だと思いました。方法、彼らは軽量です。ただし、VectorとRayで「struct」を「class」に変更するだけで、パフォーマンスが大幅に向上しました。
何が得られますか?それらは両方とも小さく(ベクターの場合は3つのフロート、レイの場合は2つのベクター)、過度にコピーされません。もちろん、必要に応じてメソッドに渡しますが、それは避けられません。では、構造体を使用するときにパフォーマンスを低下させる一般的な落とし穴は何ですか?次のようなMSDNの記事を読みました。
この例を実行すると、構造体ループが桁違いに高速であることがわかります。ただし、ValueTypeをオブジェクトのように扱う場合は、ValueTypeの使用に注意することが重要です。これにより、プログラムに余分なボクシングとアンボクシングのオーバーヘッドが追加され、オブジェクトに固執した場合よりもコストがかかる可能性があります。これが実際に動作することを確認するには、上記のコードを変更して、fooとbarの配列を使用します。パフォーマンスはほぼ同等であることがわかります。
しかし、それはかなり古く(2001)、「それらを配列に入れると、ボクシング/アンボクシングが発生する」という全体が奇妙に感じました。本当?ただし、一次光線を事前に計算して配列に入れたので、この記事を取り上げて、必要なときに一次光線を計算し、配列に追加することはありませんでしたが、何も変わりませんでした。クラスでは、それでも1.5倍高速でした。
私は.NET3.5SP1を実行していますが、これにより、構造体メソッドがインライン化されなかった問題が修正されたと思います。
つまり、基本的に、ヒント、考慮すべきこと、避けるべきことはありますか?
編集:いくつかの回答で示唆されているように、私は構造体を参照として渡すことを試みたテストプロジェクトを設定しました。2つのベクトルを追加する方法:
それぞれについて、次のベンチマーク方法のバリエーションを取得しました。
すべてがほぼ同じように機能するようです。JITによって、この構造体を渡すための最適な方法に最適化される可能性はありますか?
EDIT2:ちなみに、テストプロジェクトで構造体を使用すると、クラスを使用するよりも約50%高速になることに注意する必要があります。なぜこれが私のレイトレーサーと違うのかわかりません。
algorithm - 球面上の光線とポリゴンの交点
ポイント (緯度/経度) と、このポイントが移動する方向 (真北) を度単位で持っています。凸面である場合とそうでない場合がある多数の静止ポリゴン (緯度/経度で定義されたポイント) があります。
私の質問は、ポリゴンとの最も近い交点がある場合、どのように計算するかです。レイ トレーシングに関する紛らわしい投稿をいくつか見てきましたが、レイとポリゴンが同じ平面上になく、ポリゴンが凸状でなければならない場合、それらはすべて 3D に関連しているようです。
performance - レイトレーサーのパフォーマンスの向上
D で比較的単純なレイトレーサー/パス トレーサーを作成しています ( http://dsource.org/projects/stacy ) が、完全に最適化しても、レイごとに数千のプロセッサ サイクルが必要です。それをスピードアップするために他にできることはありますか?より一般的に言えば、レイ トレーシングの優れた最適化/より高速なアプローチを知っていますか?
編集:これは私がすでにやっていることです。
- コードはすでに高度に並列に実行されています
- 一時データはキャッシュ効率の高い方法で構造化され、16b に整列されます
- 32x32 タイルに分割された画面
- 宛先配列は、タイル内の後続のすべてのピクセルがメモリ内で連続するように配置されます
- 基本的なシーン グラフの最適化が実行されます
- オブジェクトの一般的な組み合わせ (ボックス内のプレーン-プレーン CSG) は、事前に最適化されたオブジェクトに置き換えられます
- GDC の自動ベクトル化サポートを利用できるベクトル構造体
- 光線の後続のヒットは、遅延評価によって検出されます。これにより、CSG の不要な計算が防止されます
- 三角形はサポートされておらず、優先度もありません。プレーン プリミティブのみ、および CSG 操作と基本的なマテリアル プロパティ
- バウンディングがサポートされています
graphics - ラスタライズまたはレイトレーシングに代わるレンダリング方法はありますか?
ラスタライズ(三角形)とレイトレーシングは、3Dシーンをレンダリングするために私が今まで出会った唯一の方法です。他にありますか?また、ポリゴンを使用しないなど、3Dを実行する他の実際に「そこにある」方法を知りたいです。
graphics - 3D とレイトレーシングに最適
私はいくつかのグラフィックスをいじりたいです。簡単なアニメーションやもの。私もレイトレーシングをいじりたいです。これらのことを行うのに役立つライブラリを見つけるのに助けが必要です。いくつかの要件があります。
- レイトレーシングができる必要があります
- 高水準言語 (python、.NET など) 用である必要があります。C/C++ はご遠慮ください
- できれば例を含む、適切なドキュメントが必要です。
私がだますのに使用できる良いライブラリを知っている人はいますか?