問題タブ [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.
c - 線と球の交点のパラメトリック方程式と代数方程式の違い
私は C で Raytracer を書いており、球体を描画するためにデカルト方程式を使用しています。
目の位置 (x_eye、y_eye、z_eye) と目のベクトル (Vx、Vy、Vz) があります。私の線のパラメトリック方程式は次のとおりです。
線のパラメトリック方程式を球のデカルト方程式に入れて、それを解きます
ax^2 + bx + c = 0 のような式を取得し、a、b、c を次のように定義します。
次に、交差がある場合、各ピクセルの k を見つけることができます (b^2 - 4.ac >= 0)。
しかし、これらの線と球線 のパラメトリック方程式を使用して k を見つける他の方法はありますか?
球の場合:
これら2つのパラメトリック方程式でkを見つけるにはどうすればよいですか?
やるべきですか
python - Pythonレイトレーシング
私は純粋なPythonを使用して単純なPythonレイトレーサーを構築しています(そのためだけに)が、障害にぶつかりました。
私のシーンのセットアップは現在これです:
- y軸
0, -10, 0
に沿って指すように配置されたカメラ。 1
半径がにある球0, 0, 0
。- イメージング平面-物は
1
カメラから離れた距離にあり、幅と高さは0.5
。です。
イメージング平面全体に均一にランダムに分布するフォトンを撮影しています。フォトンがオブジェクトと交差した場合、光線が通過したイメージプレーン上のポイントに対応する赤いドットをイメージキャンバスに描画します。
私の交差点コード(私は球しか持っていません):
そして私のレンダリングコード(ピクセルごとではなく、特定の数のフォトンをレンダリングします):
正しく機能するはずですが、テストイメージをレンダリングすると、球の輪郭のように見えるものは何も得られません。
私はこのようなものを期待していました:
私のコードが正しく機能しない理由を誰かが知っていますか?私はこの部分をあまりにも長い間微調整して書き直してきました...
python - パストレーシングコードが機能しないのはなぜですか?
私は楽しみのために純粋なPythonでパストレーシングを一緒にハッキングしてきましたが、以前のシェーディング(ランベルトの余弦則)があまりきれいではなかったので、再帰的なパストレーシングを実装しようとしています。
私のエンジンは中途半端な出力を出します:
私のパストレーシング関数は、次のように再帰的に定義されています。
そして、私のシーン(カスタムXML記述形式を作成しました)は次のとおりです。
私のエンジンには根本的な欠陥があると確信していますが、それを見つけることができません...
これが私の新しいトレース関数です。
手動でいくつかの光線をキャストしてかなり正当な結果を得たので、パストレーシングコードが機能すると確信しています。私が(今)抱えている問題は、カメラが画像平面のすべてのピクセルを介して光線を発射しないことです。ピクセルと交差する光線を見つけるためにこのコードを作成しましたが、正しく機能していません。
opengl - 2D投影から3D点群へのマッピング
点の頂点(XYZ)と最終的には三角形の面で構成される3Dモデルがあります。OpenGLまたはcamera-view-matrix-projectionを使用して、3Dモデルを2D平面、つまりビューウィンドウまたはm*n解像度の画像に投影できます。
問題は、2D投影計画のピクセルと、元の3Dモデルの対応する頂点(または面)との対応をどのように判断できるかです。
つまり、
2D投影からの特定のピクセルの3Dモデルで最も近い頂点は何ですか?
openGLまたはレイトレーシングの問題を選択しているように聞こえます。しかし、簡単な解決策はありますか?
レイトレーシングのアイデアでは、実際には、視点から光線と交差する最初の頂点/面を見つけることです。誰かが私にいくつかのチュートリアルや例を見せてもらえますか?OpenGLの使用とは独立したアルゴリズムを見つけたいと思います。
opengl - 3D ポリゴン モデルのビーム トレーシング (ビーム交差) 用ライブラリ
モデルからの距離やその他の機能を測定するために、3D モデルにレーザー ビームを放射するレーザー スキャナーをシミュレートしたいと考えています。3D モデルは、xyz 座標と面の頂点で構成されます。各頂点には、いくつかのユーザー定義の機能もあります。
方法は単純でなければなりません。視点とビュー ベクトル (レーザー ビーム) を定義します。私がする必要があるのは、ビューベクトルと交差する最初の頂点または最初の面をチェックすることです。次に、距離を測定し、最も近い頂点から特徴を評価できます。
それを行うための利用可能なライブラリまたはツールはありますか?
graphics - レイトレーサーでこのバグを解決するのを手伝ってください
あまりにも多くのコンテキストが必要になるため、この質問のコードは投稿しませんが、私が行っていることを概念的に説明します。
アフィン変換を使用する単純なレイトレーサーを構築しています。つまり、カメラ座標からのすべての光線を一般的な形状と交差させているということです。すべての形状にはアフィン変換が関連付けられており、シーンオブジェクトと交差する前に、光線は最初にこれらの変換の逆数で乗算されます。
たとえば、半径3の球を(10,10,10)に配置したいとします。球を作成し、この変換を表す変換行列を与えます。
カメラ座標で光線を作成します。光線に球の変換行列の逆数を掛けて、一般的な球と交差させます((0,0,0)でr = 1)。交点でこの一般的な光線に沿った距離を取り、それを使用して、一般的な法線と元の光線に沿った点を見つけ、これらを変換オブジェクトに保存します(距離(t)と実際の変換とともに)。
この交点の色を理解するときが来たら、変換の逆転置を取り、それを一般的な法線で乗算して法線を見つけます。逆変換された光線の交点からのt値を使用する場合、交点は元の変換されていない光線に沿った点にすぎません。
問題は、私がこのように物事を行うとき、変換が奇妙な効果をもたらすことです。主な効果は、変換によってライトがシーンから引きずられるように見えることです。たくさんの画像を作成し、フレームごとに球に少し大きな回転を適用すると、シーン内のライトがその周りをドラッグしているように見えます。これが例です
正直なところ、ここで何が間違っているのか理解できませんが、髪を引き裂いています。これが起こっている理由は何も考えられません。どんな助けでも大歓迎です。
math - レイトレーシングにおける3Dアフィン変換の問題
全て、
シーン内のさまざまなオブジェクトの熱伝達特性を計算するために、従来とは異なるレイトレーサーを作成しています。このレイトレーサーでは、ランダムな光線がプリミティブオブジェクトの表面からシーンに発射され、交差をチェックします。
この特定のアルゴリズムでは、各光線をプリミティブ空間で展開し、ソースオブジェクトによってワールド空間にアフィン変換し、その後、シーン内の他のオブジェクトのプリミティブ空間にアフィン変換して交差をチェックする必要があります。
たとえば、オブジェクトを[2 2 1]でスケーリングするなど、異方性スケールを実行するまでは、すべて問題ありません(等方性スケールは問題ありません)。これは、私が光線の指向性成分を正しく変換していないと私に信じさせます。現在、方向成分にソースオブジェクトの逆変換行列の転置を掛けて光線の方向をプリミティブ空間からワールド空間に変換し、次に宛先オブジェクトの転置を掛けて光線をワールド空間から各プリミティブ空間に変換します。マトリックス。
また、ソースプリミティブの変換行列を乗算してプリミティブからワールド空間に移動し、宛先の逆変換を乗算してワールド空間からプリミティブ空間に移動しようとしましたが、失敗しました。
プリミティブオブジェクトの表面から(ランダムな点でランダムな方向に)発射された光線は、「通常の」レイトレーシングの表面法線と同じ方法で変換する必要があると思いますが、確かではありません。
私の方法論の欠陥が何であるかを知っている専門家はいますか?さらに情報が必要かどうかお気軽にお問い合わせください。
このレイトレーサーの基本的なアルゴリズムは次のとおりです。
うまくいけば、質問をクリアするために例を見てみましょう。z軸(単位半径と高さ)に沿って伸びる円柱と、内径7と外径8のxy平面にある環があるとします。xとyの係数6で円柱をスケーリングします。方向(z方向ではない)なので、私のアフィン変換行列は次のようになります。
ここで、円柱sの表面にランダムな開始点があり、円柱cの表面からランダムな方向に離れて光線r(os)= s+ctを与える光線があるとします。
この光線をプリミティブ(オブジェクト)空間からワールド空間に変換してから、シーン内の他のオブジェクト(環)との交差をテストしたいと思います。
最初の質問は、M(円柱)またはM ^ -1(円柱)を使用して、光線r(os)を世界空間r(ws)に変換する正しい方法は何ですか。
2番目の質問は、光線r(ws)をワールド空間からオブジェクト空間に変換し、M(環)とM ^ -1(環)を使用して他のオブジェクトとの交差をチェックする正しい方法は何ですか。
いくつかの追加の背景情報:
このアプリケーションは、N個のオブジェクト間の放射熱伝達を計算するためのものです。光線はオブジェクト上のランダムな点から発射され、その方向はランダムな点で表面法線に向けられた半球分布内にあるようにランダムに選択されます。
これが私の問題の視覚化です。最初に生成されたときの光線の方向分布:
変換行列Mを使用して世界座標に変換を適用すると、次のようになります。
逆変換行列M^-1を使用して世界座標に変換を適用すると
opengl - fwidth で miplevel を決定する
GLSL 関数 fwidth(p) は正確には何をしますか?
私はそれが次のように実装されていることを知っています:
しかし、私はまだそれを手に入れたかどうかわかりません。
ここでは基本的なレイキャスティングを行っており、必要なミップレベルを計算しようとしています。miplevel を見つけるには、レイがボリュームに当たる座標 (テクスチャ空間内) で fwidth を呼び出します。
私の理解では、GLSL はすべてのスレッドを同期し、派生物を上と右の隣のスレッドと計算します。
トラバーサル中、範囲を線形に補間します:
これが正しい場合、レベルは現在の位置をサンプリングするために必要なミップ レベルである必要があります。しかし、現在、ボリュームのサンプリング ステップ サイズが大きすぎます...ただし、カメラまでの距離が短くなると減少します。
3d - レイトレーサー-アイレイの計算
私はレイトレーサーを書いています(主に楽しみのために)。過去に1つ書いたことがあり、検索にかなりの時間を費やしましたが、透視投影で視線を計算する方法に光を当てるチュートリアルはないようです。 、行列を使用せずに。
私が最後にそれを行ったのは、クラスx/y
を使用してカメラの方向ベクトルから目のベクトルの角度を(潜在的に)非効率的に回転させることによるものだと思います。Quaternion
これはC++で行われ、私はこれをC#で行っていますが、それほど重要ではありません。
擬似コード(V * Q =変換操作を想定)
これに関する実際の問題は、フラットスクリーン表面ではなく、球面スクリーン表面をシミュレートしていることだと思います。
クロス積、ドット積、行列などを使用する方法と理由はわかっていますが、実際の3D数学の問題解決スキルは素晴らしいものではありません。
そのように与えられた:
- カメラの位置、方向、アップベクトル
- 視野
- スクリーンピクセルおよび/またはサブサンプリング分割
レイトレーサーのx/yピクセル座標のアイレイを生成する実際の方法は何ですか?
明確にするために:私は正確に私が計算しようとしているものです、私はそれを計算するための3D数学を思い付くのが得意ではありません、そして私が見つけたレイトレーサーコードは私が目の光線を計算するために必要なコードを持っていないようです個々のピクセル。
c# - レイキャスティング/レイトレーシング:カメラから光線を発射する
私はc#で簡単なレイトレーサー/レイキャスターを書いています。過去にVectorsで有効期限が切れたので、以下のコードでわかるように、Vector3Dというクラスを作成しました。Raysを処理するクラスも作成しました。今のところ、光線がカメラから発生し、画面上のすべてのピクセルにキャストされてから、シーン内のカメラの前にあるオブジェクトにキャストされることを確認する必要があります。出力(Debug.WriteLine)にテキストを書き込むことで期限切れになりましたが、実際に機能しているかどうかを確認するのは困難です。次のコードは適切ですか、それとも私を参照/ガイドする別の方法またはサイトをお勧めしますか?