問題タブ [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.

0 投票する
2 に答える
2752 参照

c++ - OpenGLレンダリングと独自のフォンイルミネーションの実装

(0,0,0)を中心とし、球プリミティブを直接見ているカメラを使用して、フォンイルミネーションスキームを実装しました。以下は、OpenGLを使用してシーンを表示し、独自の実装を使用してシーンをレンダリングするために使用されるシーンファイルの関連コンテンツです。

ここ

OpenGLによって生成された結果の画像。

ここ

私のレンダリングアプリケーションが生成する画像。

ご覧のとおり、この2つにはさまざまな違いがあります。

  1. 私の画像の鏡面ハイライトは、OpenGLのものよりも小さいです。
  2. 拡散サーフェスが正しい方法で拡散していないように見えるため、画像の黄色の領域が不必要に大きくなりますが、OpenGLでは、球の下部に近い素敵な濃い緑色の領域があります。
  3. OpenGLによって生成された色は、私の画像の色よりもはるかに暗いです。

これらは私が見る最も顕著な3つの違いです。以下は、Phongイルミネーションの私の実装です。

関連するLightIntensity(...)およびLightDirection(...)関数は次のとおりです。

明らかな実装エラーについての提案をいただければ幸いです。OpenGLによる表示に使用されるガンマ値と、表示のデフォルトのガンマ値が原因で、違いが発生しているのではないかと思います。また、OpenGL(または少なくとも私が提供したパーツ)はオブジェクトに影を落とすことができないことも知っています。これは問題のポイントに関連しているわけではありませんが、OpenGLと私がやろうとしていることの表示と機能の違いだけなのかどうか疑問に思います。

ご協力ありがとうございました。

0 投票する
3 に答える
2765 参照

c++ - カメラとビュー平面を指定した2Dポイントの3D座標

カメラからビュープレーンを介して光線を生成したいと思います。これを行うには、カメラの位置(「目」)、上、右、およびベクトル(towardは、カメラが見ているオブジェクトの方向へのカメラからのベクトル)とPが必要です。表示面上のポイント。これらを取得すると、生成される光線は次のようになります。

ここで、tは光線に沿った距離です(今のところt = 1と仮定します)。

私の質問は、点Pが表示平面上の位置(i、j)にある場合、どのようにして点Pの3D座標を取得するのですか?表示平面の左上隅と右下隅が指定されていると仮定します。

注:表示平面は、すべての方向に無限に伸びないという意味で、実際には平面ではありません。むしろ、この平面をwidthxheightイメージと考えることができます。x方向の範囲は0->幅で、y方向の範囲は0->高さです。(i、j)番目の要素の3D座標を見つけたい0

0 投票する
1 に答える
597 参照

c++ - c++ 再帰エラー

次の再帰コードがありますが、期待どおりに動作しません (以下の詳細を参照)。

これComputeIntersectionNode(...)は、再帰呼び出しに加えて、プログラム内の複数の光線に対しても呼び出されています。この関数をテストするために、 4raysと 4に対して実行しますnodes(より正確には、 を持たず4 を持ち、それぞれに を 1 つ持つroottypeの 1 つ)。テストのために、それぞれが正確に 1 つの/と交差します。nodeshapechildrenshaperaynodeshape

最初の の GDB でコードを実行すると、最初rayに がコードを介して渡されますが、rootこれには がありません。最初の子の交差を正しく計算し、変数も正しく設定します。これは再帰の最高レベルに返され、ここで設定されますshapechildrenclosest_interchild_interclosest_interchild_inter.hit = 1;

次に、2 番目の子が処理されます。ComputeIntersectionShape(...)2 番目の子との交差を返しません ( shape_inter.hit == 0;) - これは予期された動作です。ただし、関数が最上位の再帰に戻ると、何らかの理由で child_inter.hit が 1 に設定されます (ただし、0 に設定する必要があります)。

助言がありますか?

前もって感謝します。

0 投票する
1 に答える
788 参照

raytracing - 行列変換を使用したシーントラバーサル中のレイボックス交差

レイボックスの交差点をテストする方法はいくつかあります。

  1. ComputeIntersectionBox(...)メソッドを使用すると、引数として光線とボックスを受け取り、光線とボックスの最も近い交点を計算します。この方法は、ボックスの各面で平面を形成し、各平面との交点を見つけることによって機能します。交点が見つかると、交点がコーナーポイントの間にあることを確認することにより、ポイントがボックスの表面上にあるかどうかがチェックされます。このアルゴリズムを2つの異なるボックスで実行した後に光線を見ると、正しい交差が得られます。

  2. 2つの球、12面体(三角形メッシュ)、および2つのボックスを持つシーンで、行列変換を使用せずにComputeIntersectionScene(...)メソッドを使用します。ComputeIntersectionScene(...)は、シーングラフのすべてのノードを再帰的にトラバースし、指定された光線との最も近い交差を計算します。特にこのテストでは、親ノードが持つ可能性のある、子にも適用する必要のある変換は適用されません。このテストでは、正しい交差点も取得します。

  3. 行列変換でComputeIntersectionScene(...)メソッドを使用します。このテストは、光線とシーン内のノードとの交差を見つける前に、ノードの変換行列の逆行列を使用して光線がノードの座標フレームに変換され、交差が計算された後、この交差が計算されることを除いて、上記のテストと同様に機能します。変換行列を交点に適用することにより、ワールド座標に変換されます。

2で説明したのと同じシーンファイルで3番目の方法でテストする場合、4つの光線でテストします(したがって、1つの光線が1つの球と交差し、1つの光線が他の球と交差し、1つの光線が1つのボックス、1つの光線が他のボックス)、 2つの球は交差し、2つのボックスは交差しません。ComputeIntersectionBox(...)メソッドを調べてデバッグすると、光線はボックス上のすべての平面と交差しますが、各交差点はボックス上にないことが実際にわかります。

これは奇妙な動作のようです。変換なしでテスト2を使用すると、正しいボックスの交点が得られ(したがって、レイボックスの交点が正しいと思います)、変換を使用してテスト3を使用すると、正しい球の交点が得られます(したがって、変換された光線は問題ないと思います)。

私が間違っている可能性のある提案はありますか?

前もって感謝します。

0 投票する
1 に答える
2916 参照

mapreduce - opencl で古典的な map-reduce の問題を解決しますか?

私は、古典的なマップ削減の問題 (MPI とうまく並列できる) を OpenCL、つまり AMD 実装と並列化しようとしています。しかし、結果が気になります。

最初に問題について簡単に説明させてください。システムに流れ込むデータには、機能セット (それぞれに 30 個のパラメーター) とサンプル セット (それぞれに 9000 以上のディメンション) の 2 種類があります。これは、すべてのサンプル (マップ) のすべての機能のスコアを計算する必要があるという意味で、古典的なマップ削減問題です。そして、すべての機能の全体的なスコアを合計します (削減)。約 10,000 の機能と 30,000 のサンプルがあります。

問題を解決するためにさまざまな方法を試しました。まず、問題を特徴ごとに分解してみました。問題は、スコア計算がランダム メモリ アクセスで構成されていることです (9000 以上のディメンションのいくつかを選択し、プラス/マイナス計算を行います)。メモリアクセスを合体できないのでコストがかかります。次に、問題をサンプルごとに分解してみました。問題は、全体的なスコアを合計すると、すべてのスレッドがいくつかのスコア変数をめぐって競合することです。間違っていることが判明したスコアを上書きし続けます。(10k * 30k * 4バイトが必要なので、最初に個別のスコアを実行して後で合計することはできません)。

最初に試した方法では、8 スレッドの i7 860 CPU でも同じパフォーマンスが得られました。ただし、この問題が解決できないとは思いません。レイ トレーシングの問題 (数百万の三角形に対して数百万のレイを計算する) と非常によく似ています。何か案は?

さらに、私が持っているコードのいくつかを投稿しています:

機能ごとに分解します(機能しますが、遅いです):

サンプルごとに分解しますが、機能しません:

0 投票する
5 に答える
12289 参照

algorithm - レイボックス交差理論

光線とボックスの交点を特定したいと考えています。ボックスはその最小 3D 座標と最大 3D 座標によって定義され、光線は原点とそれが指す方向によって定義されます。

現在、ボックスの各面に対して平面を形成しており、光線と平面を交差させています。光線が平面と交差する場合は、交点が実際にボックスの表面上にあるかどうかを確認します。そうであれば、それがこのレイの最も近い交差点であるかどうかを確認し、最も近い交差点を返します。

平面の交点がボックスの表面自体にあるかどうかを確認する方法は、関数を使用することです

ここで、corner1はそのボックス面の長方形の 1 つの角であり、corner2は反対側の角です。私の実装はほとんどの場合機能しますが、時々間違った交差点が表示されます。画像をご覧ください:

代替テキスト

この画像は、カメラの目から出てボックスの表面に当たる光線を示しています。他の光線は、ボックス サーフェスの法線です。特に 1 つのレイ (実際に表示されているのは法線) がボックスの「背面」から出ているのに対し、法線はボックスの上部から出ていることがわかります。ボックスの上部に正しく当たる光線が他にも複数あるため、これは奇妙に思えます。

交点がボックス上にあるかどうかを確認する方法が正しいかどうか、または他のアルゴリズムを使用する必要があるかどうか疑問に思っていました。

ありがとう。

0 投票する
1 に答える
743 参照

physics - Phong モデルを使用したポイント ライト照明

フォン照明スキームを使用して、1 つのボックスと点光源を含むシーンをレンダリングしたいと考えています。以下は、私の計算に関連するコード スニペットです。

指向性光源を使用してコードを実行すると、目的のレンダリング イメージが得られるため、エラーはいずれかLightDirection(...)または関数のどこかにあるはずです(したがって、これにより、Phong 照明方程式が正しいと信じるようになります)。LightIntensity(...)また、Phong(...) では、intensity_diffuseデバッグ中に andを計算したときにlight_color、10 で割ると、必要なものにより近い結果の画像が得られました。light_colorを正しく計算していますか?

ありがとう。

0 投票する
1 に答える
631 参照

3d - 3D から 2D へのレイトレーシングにおけるソフト シャドウ

レイトレーサーでエリア ライトによって生成されるソフト シャドウを実装したいと考えています。ランダム サンプルの生成に問題があります。そのため、中心のワールド (x、y、z) 座標が指定され、半径が指定され、円が存在する平面の法線が指定されたエリア ライト (円として表される) があるシーンがあります。色と減衰係数と同様に与えられます。

使用したいサンプリング スキームは次のとおりです。円を囲む四辺形でサンプルを生成し、円内の必要な数のサンプルが見つかるまで、円の外側のポイントを破棄します。円の中心の 3D 座標を 2D 表現に変換する方法を理解するのに苦労しています (円の投影が xy 軸上にあると仮定できないため、 z コンポーネント)。平面の法線情報を使用する必要があると思いますが、方法がわかりません。

あらゆる提案を歓迎します。

0 投票する
2 に答える
1816 参照

math - 3D 点が 2D 円の内側にあるかどうかを判断する

ポイント P(x,y,z) が、中心 C (cx, cy, cz)、半径 R、および円が N 上にある平面に垂直で定義される 3D 空間の 2D 円の内側にあるかどうかを判断したいと考えています。

3D 空間の 2D 円上にある点 P は、次のように定義されることを知っています。

P = R*cos(t) U + R sin(t)*( N x U ) + C

ここで、Uは円の中心から円上の任意の点までの単位ベクトルです。しかし、点 Q が与えられたとき、Q が円の上にあるか円の内側にあるかはどうすればわかりますか? t選択する適切なパラメーターは何ですか? また、点 Q が円内にあるかどうかを確認するには、どの座標を比較すればよいでしょうか?

ありがとう。

0 投票する
1 に答える
82 参照

graphics - 「.OFF」の説明

メッシュとプリミティブ(球、円柱、ボックスなど)を使用するシーンを作成したいと思います。山、岩、木、動物などの複雑なメッシュを記述した.offファイルをどこで見つけることができるかについての推奨事項があるかどうか疑問に思いました。