問題タブ [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.
algorithm - エレガント/クリーン(特殊なケース)直線グリッドトラバーサルアルゴリズム?
私は私の古いプロジェクトを捨てています。それがしなければならなかったことの1つは-デカルトグリッドシステムとグリッド上の2つの正方形が与えられた場合、それらの2つの正方形の中心を結ぶ線が通過するすべての正方形のリストを見つけます。
ここでの特殊なケースは、すべての開始点と終了点が正方形/セルの正確な中心に限定されることです。
ここにいくつかの例があります-サンプルの開始点と終了点のペアを使用します。影付きの四角は、それぞれの関数呼び出しによって返される必要がある四角です。
死んだImageShackリンクを削除しました-例
始点と終点は、それらが入っている正方形で参照されます。上の図では、左下がであると仮定すると、[1,1]
右下の線はとして識別さ[6,2]
れ[9,5]
ます。
つまり、左から6列目の(中央の)正方形から2行目の下から9列目の(中央の)正方形まで、下から5行目です。
これは実際にはそれほど複雑ではないようです。しかし、どういうわけか、オンラインで複雑なアルゴリズムを見つけて実装したようです。
とても、とても速かったことを覚えています。同様に、フレームごとに数百回または数千回の速度で最適化されます。
基本的に、線(線がグリッド線と交差する点)に沿って、正方形の境界から境界へとジャンプしました。次の交差点がどこにあるかを知るには、水平方向と垂直方向のどちらの交差点が近いかを確認し、次の交差点に移動しました。
これは概念的には大丈夫ですが、実際の実装はそれほどきれいではないことが判明し、最適化のレベルが実際に必要なものに対して高すぎる可能性があることを恐れています(私はこのトラバーサルと呼んでいます)アルゴリズムはおそらく1分間に5〜6回)。
シンプルでわかりやすく、透明な直線グリッド走査アルゴリズムはありますか?
プログラム用語で:
ここで、指定された座標は正方形自体を識別します。
いくつかの例:
コーナーを直接移動する線には、線の「翼」に正方形を含めないでください。
(古き良きブレゼンハムはここで機能するかもしれませんが、私が望むものから少し逆になっています。私が知る限り、それを使用するには、基本的にそれを線に適用してから、上のすべての正方形をスキャンする必要があります真または偽のグリッド。大きなグリッドの場合は実行不可能(または少なくともエレガントではない))
(私の誤解のため、ブレゼンハムとブレゼンハムベースのアルゴリズムを再検討しています)
明確にするために、これの1つの可能なアプリケーションは、ゾーン(グリッド)内のゲームにすべてのオブジェクトを格納していて、光線があり、光線がどのオブジェクトに接触するかを確認したい場合です。このアルゴリズムを使用すると、マップ上のすべてのオブジェクトではなく、指定されたゾーン内にあるオブジェクトのみに対して光線をテストできます。
私のアプリケーションでこれを実際に使用すると、すべてのタイルに効果が関連付けられ、オブジェクトは毎ターン特定の線分を移動します。毎ターン、オブジェクトが通過したマス目、つまりオブジェクトに適用する効果を確認する必要があります。
この時点で、私が持っている現在の実装は機能することに注意してください。この質問は主に好奇心を目的としています。このような単純な問題には、もっと簡単な方法が必要です...どういうわけか...。
私は正確に何を探していますか?概念的に/きちんとしていてきれいなもの。また、正確に指定しているため、すべての開始点と終了点は常に正方形/セルの中心にあることに気付きました。だから、おそらくそれを利用する何かもきちんとしているでしょう。
c - このレイキャスティング アルゴリズムを斜めにならないように変更するにはどうすればよいですか?
そこで機能です。lengthdir_x/y
ですsin/cos(dir)*dist
。そこにCタグを付けたことで怒鳴らないでください。言語は非常によく似ており、これをそのままコピーするところまで来ました。
正しい、手続き完了: この現在のアルゴリズムは時々斜めに進みます (x と y の両方がいずれかの符号で 1 ずつ変化する) が、これを行わないことを望みます。
EG:
現在: (X はレイ キャスト)
募集:
わかる?
助けてください。
graphics - レイトレーサーが「マウント」シーンを再現しないのはなぜですか?
Eric Haines の Standard Procedural Database (SPD)から「マウント」シーンをレンダリングしようとしていますが、屈折部分は協力したくありません。私はそれを修正するために考えられるすべてを試しました。
これは私のレンダリングです(ワットの式を使用):
(出典: philosoraptor.co.za )
これは、「通常の」式を使用した私のレンダリングです。
(出典: philosoraptor.co.za )
そして、これは正しいレンダリングです:
(出典: philosoraptor.co.za )
ご覧のとおり、ほとんどが球の極の周りにいくつかのエラーしかありません。これは、屈折、または何らかの精度エラーが原因であると私に思わせます。
シーンには実際には 4 つの球体があり、それらの NFF 定義 ( s x_coord y_coord z_coord radius
) は次のとおりです。
つまり、前景のより明白な 3 つの球体の後ろに 4 番目の球体があります。それは、これら 3 つの球体の間に残された隙間に見られます。
これは、その 4 番目の球体だけの写真です。
(出典: philosoraptor.co.za )
そして、これは最初の球だけの写真です:
(出典: philosoraptor.co.za )
私のバージョンと正しいバージョンの両方に存在する奇妙な点の多くが欠落していることに気付くでしょう。これらの効果は、球体間の相互作用の結果であると結論付けることができます。問題は、どの相互作用かということです。
私は何を間違っていますか?以下は、私がすでに検討した潜在的なエラーの一部です。
- 屈折ベクトル式。
私が知る限り、これは正しいです。これは、いくつかの Web サイトで使用されているのと同じ式であり、私はその導出を個人的に検証しました。これが私がそれを計算する方法です:
double sinI2 = eta * eta * (1.0f - cosI * cosI);
Vector transmit = (v * eta) + (n * (eta * cosI - sqrt(1.0f - sinI2)));
transmit = transmit.normalise();
Alan Watt による 3D Computer Graphics、第 3 版で別の公式を見つけました。これにより、正しい画像に近づけることができます。
唯一の違いは、最後に eta^2 で割っていることです。
- 全反射。
残りの交差コードの前に次の条件を使用して、これをテストしました。
- イータの計算。
この問題には、スタックのようなアプローチを使用します。
ご覧のとおり、これにより、この光線を含む以前のオブジェクトがスタックに格納されます。コードを終了すると、現在の IOR がスタックからポップされ、それを使用して、その下の IOR とともに eta が計算されます。私の知る限り、これが最も正しい方法です。
これは、ネストされた送信オブジェクトに対して機能します。ただし、交差する送信オブジェクトでは機能しません。ここでの問題は、交差点の IOR を個別に定義する必要があることです。これは、NFF ファイル形式では行われません。その場合、「正しい」行動方針が何であるかは不明です。
- 新しい光線の原点を移動します。
新しい光線の原点は、前の光線と同じ点で交差しないように、送信されたパスに沿ってわずかに移動する必要があります。
p += transmit * 0.01f;
この値を (0.001f) と (0.0001f) に小さくしようとしましたが、球体がソリッドに見えます。これらの値では、光線が前の交点から十分に離れていないと思います。
編集: ここでの問題は、リフレクション コードが同じことをしていたことです。そのため、オブジェクトが屈折するだけでなく反射する場合、光線の原点は完全に間違った場所になります。
- 光線の跳ね返りの量。
レイ バウンスの量を人為的に 4 に制限しました。この制限を 10 に上げてテストしましたが、問題は解決しませんでした。
- 法線。
球の法線を正しく計算していると確信しています。交点を取り、球の中心を引き、半径で割ります。
polygon - Object File Format (.off) ファイルからポリゴンを読み込む
Object File Format (.off) ファイル (C++) からポリゴンのリストを読み込む必要があります。.off ファイルの形式は、基本的に次のようになります。
.off ファイルでは、ポリゴンごとに任意の数の頂点を使用できるため、質問が発生します。どの頂点がどの頂点に接続されているかをどのように知ることができますか? たとえば、.off ファイルが次のように読み取られた場合:
ポリゴンは 4 辺ですが、すべての頂点が接続されているわけではありません。各頂点を他の頂点に単純に接続すると、1 つの 4 辺ポリゴンではなく 4 つの 3 辺ポリゴンになります。頂点がサイクル表記と同様の方法でリストされていることを望んでいましたが、これに関する情報が見つからないようなので、そうではないと推測しています。
だから私の質問は:
.off ファイルがこの接続を示すために使用する形式はありますか? そうでない場合、どの頂点が .off ファイルで接続されているかを判断する他の方法はありますか?
opengl - 最新の OpenGL でレイ トレーシングを行う方法は?
ですから、単色のモデルにライティングを開始する必要があります。テスト アプリケーションは、最新のメソッドのみを実装するためのテスト ケースであるため、理想的にはレイ トレーシングを実装する必要があることに気付きました (理論的には、数年後にはリアルタイム グラフィックスに最適になる可能性があるため)。
しかし、どこから始めればよいのでしょうか?
古い OpenGL でライティングを行ったことがないので、推奨されていないメソッドに直接進むとします。
アプリケーションは現在、頂点バッファー オブジェクト、頂点、法線、および色の入力を適切に設定しており、モデルを空間内で単色で正しく描画および変換しています。
フラットな色の頂点から GLSL を介して適切な最終結果を得るために必要なすべての情報を取得する情報源はありますか? 理想的には、それを補完するために必要になる可能性のある他の追加の照明方法を使用します。
opengl - Ken Silverman の Voxlap エンジンで使用されているアルゴリズムを誰か説明できますか?
私が集めたものから、彼はスパース ボクセル オクトリーとレイキャスティングを使用しました。彼が opengl や direct3d を使用したようには見えません。ゲームの Voxelstein を見ると、単なる 2D 正方形の集まりではなく、ミニチュア キューブが実際に描画されているように見えます。それは私を不意を突かれたので、openglまたはdirect3dなしで彼がどのようにそれを行っているのかわかりません。
ソースコードを読んでみましたが、何が起こっているのか理解するのは困難でした。私は似たようなものを実装したいと思いますし、アルゴリズムにそうさせたいと思っています。
彼がレンダリング、カリング、オクルージョン、ライティングをどのように行ったかに興味があります。どんな助けでも大歓迎です。
objective-c - iOS でのリアルタイム レイトレーサーの C または ObjC?
iOS 用のリアルタイム レイトレーサーの構築を開始しています。私はこのレイトレーシングのことは初めてです。これまでに行ったことは、ObjC で初歩的なものを書くことだけです。C ベースのレイトレーサーは ObjC で書かれたものよりも高速になるように思えますが、オブジェクト階層が非常に便利になるため、ObjC のものははるかに単純になります。ただし、速度は非常に重要です。リアルタイムにしたいので、たとえば 30 fps です。
C の高速化が複雑さを増す価値があるかどうかについて、あなたの意見は? C のコードにはもっと時間がかかり、多くのバグで頭痛の種になることは予測できます (私は C は初めてではありませんが)。
C で書かれたレイトレーサーの例はありますか? そのようなことを Google で検索すると、C++ と C# の多くの結果が表示されます。
graphics - ネストされたオブジェクトの内部で光線が開始するときの屈折の処理方法
教育目的で単純なレイトレーサーを作成していて、オブジェクトに屈折を追加したいと思います。スネルの法則を使用して、交点で再帰的に新しい光線を作成することができます。レイトレーサーは現在球のみをサポートしており、屈折率が異なる複数の球が互いに入れ子になっているシーンを使用しています。
球の外側から光線を開始すると、すべてが単純に見えます。シーンの屈折率から始め、最初の球に当たるとすぐに、前の屈折率と球のマテリアルの屈折率を使用して光線を屈折させ、次の球に当たるまで続けます。交差点の法線を使用して、球に入るのか出るのかを判断できます。
ただし、球葉をどのように処理する必要があるのか、シーンの外側で光線が始まらない場合はどうすればよいのかわかりません。
- 屈折率のスタックを取得して、球を離れたらすぐに1つ上に移動できますか?
- 球の内側から開始する場合、どの屈折率で開始する必要があるかをどのように判断できますか?
例
外側から内側への屈折率が0.9、1.1、0.8の3つの球があります。空気指数は1.0です
カメラは球の外側にあり、球の中心を指しています。
- 開始インデックスが1.0の場合、最初にインデックス0.9で外側の球にヒットし、1.0から0.9に屈折し、光線が0.9のマテリアルになったことを保存します。
- 真ん中の球に当たると、材料定数が1.1になります。これは、0.9を保存したので、0.9から1.1に屈折し、0.9に加えて1.1を保存する必要があることを知っています。
- 内側の球に当たって1.1から0.8に屈折し、今まで0.9、1.1、0.8を保存しました
- 内側の球をもう一度叩きます(今回は球を終了するので、保存した値を確認して、1.1に戻す必要があることを確認します)
- ...あなたが外に出るまで
カメラが球の中にあるとき、今問題があります。どの屈折率に切り替える必要があるかわかりません。
c++ - 設定後もガベージ値を与えるポインタ
ポインターに奇妙な問題があります。レイトレーシング用のkdツリーを構築しており、BuildKDtree関数の実行中に、root->leftおよびroot->rightを出力し、ノードに格納されているさまざまな属性の正しい値を取得します。そのコードを完成させてから、元のルートのポインターを使用してツリーをトラバースしようとすると、root->leftとroot->rightの値にガベージが含まれ、コードがクラッシュします。これを引き起こしている可能性があるものについての提案はありますか?必要に応じてコードを貼り付けることもできますが、かなり不器用です。
math - 光線交差間隔とは何ですか?
レイ/ボックス交差のコンテキストでは、「有効な交差間隔」とは正確には何ですか? 私はさまざまなチュートリアルを検索してきましたが、ほとんどの場合、アプリオリな知識としてこれを期待しているようです.