問題タブ [raycasting]
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 - マップを表すテキスト ファイルを四分木構造に解析します
学校の課題として疑似ウルフェンシュタイン 3D を作成する必要があり、マップを表す構造が必要です。すべての計算は 2 次元グリッドに基づいているため、四分木が必要だと考えました。
たとえば、これを含むファイルをどのように解析しますか。
1 は壁ブロックで、0 は空のブロックで、四分木構造になっていますか?
raycasting - 球の法線ベクトルを取得するにはどうすればよいですか?
単純なレイ トレーシング アルゴリズムを実装する必要がありますが、球の原点と半径、および光線の方向がある場合、球の法線ベクトルを取得する方法がわかりません。Wiki aboute sphereに感謝 しますが、これから理解できません
opengl - レイ キャスティング アルゴリズムを使用したボリューム レンダリング (glsl を使用)
レイ キャスティング アルゴリズムを使用してボリューム レンダリングを学習しています。ここで良いデモとチュートリアルを見つけました。しかし問題は、nVidia ではなく ATI グラフィック カードを使用しているため、デモで cg シェーダーを使用できないため、cg シェーダーを glsl シェーダーに変更したいと考えています。私は OpenGL のレッド ブック (第 7 版) を読みましたが、glsl と cg には詳しくありません。デモの cg シェーダを glsl に変更するのを手伝ってくれる人はいますか? または、レイキャスティングを使用したボリュームレンダリングの最も単純なデモの材料はありますか(もちろんgslで)。 これがデモの cg シェーダです。友人の nVidia グラフィック カードでも動作します。私を最も混乱させているのは、cg のエントリ部分を glsl に変換する方法がわからないことです。たとえば、次のようになります。
さらに、たとえば、画面を描画するときに 2 つの texcoord を割り当てれば、シェーダーに 2 つのテクスチャー ユニットを持つ 2 つのテクスチャー オブジェクトをバインドするプログラムを記述できます。
glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
デモでは、プログラムは 2 つのテクスチャ (1 つの 3D に対して 1 つの 2D に対して 1 つの 2D に対してbackface_buffer
1 つの 3D に対して 1 つvolume texture
)にバインドしますが、ユニットはボリューム テクスチャに対してglMultiTexCoord3f(GL_TEXTURE1, x, y, z);
だと思いますが、どちら (テクスチャ ユニット) が? 私が知る限り、シェーダーでテクスチャ obj をバインドするには、バインドするテクスチャ ユニットを取得する必要があります。GL_TEXTURE1
backface_buffer
プログラムは正常にコンパイルされ、正常にリンクされています。しかし、3 つの場所 (texloc、volume_texloc、stepsizeloc) のうち -1 しか取得できませんでした。最適化されている可能性があることはわかっています。cg シェーダーを glsl シェーダーに変換するのを手伝ってくれる人はいますか?
編集: glslを使用した最新の OpenGL API 実装 (C++ ソース コード) に興味がある場合: Volume_Rendering_Using_GLSL
raytracing - Skewed: シンプルな CPU ベースのボクセル raycaster/raytracer の回転カメラ
学習課題として、単純なボクセル レイキャスターを書こうとしています。これは、物事が正確にどのように機能するかを理解するまで、今のところ純粋に CPU ベースです。
これで、透視投影カメラが世界を移動できるようになり、(ほとんどの場合、調査が必要なアーティファクトを除いて) 透視補正された「世界」の 3 次元ビューをレンダリングできるようになりました。これは基本的に空ですが、スタンフォード バニーのボクセル キューブが含まれています。
だから私はカメラを上下に動かしたり、左右に機銃掃射したり、「前後に歩いたり」できるカメラを持っています。ここに私の問題があります。
スクリーンショット: (1) ボクセルのレイキャスティング中... ...(2) カメラはそのまま... ...(3) 厳密に軸合わせ。
今、私は数日間、ローテーションを機能させようとしています。行列と 3D 回転の背後にある基本的なロジックと理論は、理論的には非常に明確です。それでも、カメラが回転したときに「2.5 レンダリング」しか達成できませんでした... Google ストリートビューのように魚眼のように見えます: 立体的な世界表現を持っていても、何を試しても私のように見えます最初に「正面図」からレンダリングを作成し、次にそのフラット レンダリングをカメラの回転に従って回転させます。言うまでもなく、光線の回転は特に必要ではなく、エラーが発生しやすいことは今ではわかっています。
それでも、可能な限り単純化されたレイキャスト レイの位置と方向のアルゴリズムを使用した最新のセットアップでは、私の回転は依然として同じ魚眼のようなフラット レンダー回転スタイルの外観を生成します。
カメラは「右に 39 度回転しました」 -- スクリーン 2 の立方体の左側の青い影がこの回転では見えないことに注意してください。
もちろん、私はこれを認識しています。最初に持っていたような単純な軸に沿った回転なしのセットアップでは、光線は単純に正の z 方向を小さなステップで横断し、左または右と上に発散します。ピクセル位置と投影行列に応じて、または下のみ。「カメラを右または左に回転させる」(つまり、Y 軸を中心に回転させる) と、まさにそのステップが適切な回転行列によって単純に変換されますよね? したがって、前方トラバーサルの場合、Z ステップはカムが回転するほど少し小さくなり、X ステップの「増加」によって相殺されます。しかし、ピクセル位置ベースの水平 + 垂直発散の場合、x ステップの分数を増やす必要があり、z ステップに「追加」する必要があります。どういうわけか、私が実験した多くのマトリックスのどれも、
これが私の基本的なレイごとの事前トラバーサル アルゴリズムです。Go の構文ですが、疑似コードとして使用します。
- fxとfy : ピクセル位置 x と y
- rayPos : ワールド空間でのレイ開始位置の vec3 (以下のように計算)
- rayDir : レイ トラバーサル中に各ステップで rayPos に追加される xyz ステップの vec3
- rayStep : 一時的な vec3
- camPos : ワールド空間でのカメラ位置の vec3
- camRad : ラジアン単位のカメラ回転の vec3
- pmat : 典型的な透視投影行列
アルゴリズム/擬似コード:
私はトラバーサルとサンプリングの部分をスキップしています - 画面#1から#3に従って、それらは「基本的にほとんど正しい」(きれいではありませんが)-軸が整列/回転していない場合。
ios - iOS GLSL 球面ハーモニック シェーダー。iOS GPU を使用してレイキャストする方法
私が書いている iOS アプリの Spherical Harmonics シェーダー プロジェクトを開始しています。私はこの主題に関するこの優れた詳細な論文 (PDF) - http://bit.ly/aQmax3を読むことから始めました。
この論文では、レイキャスティングを含むシーンの前処理ステップについて説明しています。iOS で GLSL を使用してレイキャスティングを実行する方法を誰か説明できますか?
3d - レイマーチングの距離で視円錐半径(つまり、ピクセルのサイズ)を計算する方法は?
私はGLSLで「距離フィールドのレイマーチング」(適切な用語:球体追跡)をしています。その上にコーン マーチングを実装するには (また、コーン マーチングが追加されているかどうかに関係なく、レイ マーチングのステップ数を最小限に抑えるため)、任意の距離でのレイ コーンの半径を推定する必要があります。
レイマーチング距離フィールドを思い出してください。オブジェクトまでの距離がしきい値よりも小さい場合、「ヒット」が記録されます。多くの場合、nearLimit または epsilon という名前のコードで記録されます。このしきい値は、移動距離に応じて指数関数的に増加する場合、光線円錐半径と同等であると見なすことができます。この方法では、直線の細い光線を空間に発射するのではなく、透視投影に従って円錐を拡大します。これにより、「正しい」遠くのオブジェクトをキャッチすることがより正確にカバーされます (この時点では、距離 t にある表示コーン内のすべての交差オブジェクトのマテリアルのブレンドと法線のフィルタリングの問題は無視しましょう...)。
ステップ 0 で、この半径は次のようなもので近似できます。
これは、開始半径を距離に適用することにより、各ステップで指数関数的に増加できます。
これは正常に機能しますが、まだアーティファクトがあります。fInitialRadius*fInitialRadius を使用すると (640px フレームバッファーと単位幅のビュープレーンの初期半径が 1/640 であるため、結果として小さい数値になります)、アーティファクトが少なくなり、より正確な結果が得られます。しかし、どちらのアプローチも不正確です。前者は積極的すぎます (半径を大きくするのが早すぎます)。後者は怠惰すぎます (半径を大きくするのが遅すぎます)。
fNearLimit / 特定の距離での円錐半径を増加させる最も正確な係数は、現在の視野を考慮に入れる必要があり、視野が 45° か 60° か 90° か...
TL;DR :ステップ 0 での初期ピクセル半径と視野角が与えられた場合に、与えられた距離での円錐半径の適切な計算または最も許容できる近似値を知りたいですか?
opengl - これはボリューム レンダリングの結果です。他の 3D オブジェクトとやり取りする方法
CUDA でレイキャスティングを使用してボリューム レンダーを実装しました。ここで、他の 3D オブジェクト (私の場合は 3D 地形など) をシーンに追加し、ボリューム レンダリングの結果と相互作用させる必要があります。例えば、ボリュームレンダリング結果を地形に重ねて移動した場合、ボリュームレンダリング結果の重なっている部分をクリッピングするなど、ボリュームレンダリング結果を変調したい。
ただし、ボリューム レンダーの結果は、レイが累積した色から得られるため、深度のない 2D 画像になります。そのため、相互作用を実装する方法は私を非常に混乱させます。誰かが私にヒントを与えることができますか?
opengl - glslでシェーダープログラムを切り替える方法
プログラム可能なパイプライン (glsl を使用) を使用し、固定パイプラインを使用せずにボリューム レンダリングを実行したいと考えています。2 つのシェーダー プログラムを使用して 2 つのパスで実装しexitPointProg
ますrayCastProg
。最初のパスは、レイキャスティングを行う次のパスでテクスチャとして使用されるキューブ バウンディング ボックスの出口ポイント (つまり背面) を取得することです。レイキャスティング ボリューム レンダリングを行うというアイデアは、ここから生まれました。プログラム可能なパイプラインと組み合わせた固定パイプラインでこれを実装したので、ほとんどのことを正しく行ったと思います。私を混乱させたのは、最初のフレームで結果を達成し、フラッシュで画面上の表示が完全に白くなったことです(glClearColor(1.0f, 1.0f, 1.0f, 1.0f)
. シェーダープログラムやFBOの切り替えに問題があるのではないかと思います。render() 関数で行うことは次のとおりです。
- 最初のパスでは、テクスチャがバインドされた fbo にレンダリングして、
exitPoints
シェーダー プログラムを使用してキューブ バウンディング ボックスの出口ポイントを取得しますexitPointProg
。 2ed パスで、シェーダーで使用される均一な sampler2D 変数として、
exitPoints
テクスチャー (にバインドGL_TEXTURE1
) をシェーダー プログラムにマップしました。rayCastProg
ここにsetupFBO
andrender
と 2 つのサブルーチンがありsetupFBO()
ます: 関数:関数
render()
:関数
getExitPoints()
:関数
rayCasting
:Qt で QGLWidget から継承したクラスを使用しています。先に述べたように、最初のフレームだけで正しい結果が得られ、すぐにフラッシュして完全に白くなりました。これのどこが悪いのかわからないのですが、シェーダープログラムの切り替えかFBOの事で何か問題があるのでしょうか?私はこれに長い間取り組んできましたが、それを理解することはできません。
編集して 、FBOで複数のglslシェーダープログラムを使用する方法を示すデモまたはチュートリアルはありますか?
opengl - CUDA で、カーネル関数で画面空間座標をワールド空間座標に変換する方法
ここでは、実際の 3D シーンにレイキャスティングを追加しようとしています。ご存知のように、レイキャスティングでは、レイをキャストするために、レイの方向を取得する必要があります。光線の最初の点は、glLookAt から取得できる光線の開始点です。光線の 2 番目の点は、画面内の各点です。元の CUDA レイキャスティング SDK では、以下のコードによってカーネル関数でスクリーン ポイントを取得します。
(x,y) は画面空間の座標ですよね? そのため、(x, y) をワールド空間座標に変換する必要があります。親切な人が、gluUnProject を使ってこの仕事をすると言った。いい考え!ただし、CUDA カーネルで OpenGL 関数を呼び出すことはできません。
可逆行列を使用して翻訳を行うことができるかもしれません。しかし、正しい方法についてはわかりません。CUDA カーネル関数で画面座標をワールド座標に変換する方法についてヒントをくれる人はいますか?
c++ - pclで点ベクトルをレイキャストすることは可能ですか?
私は3Dポイントの世界を持っています。そのa [x,y,z]
方向と方向(方位角θ
、極角)にポイントb [x2,y2,z2]
があります。光線(ポイントから方向に送信a
される)が停止するポイントを取得したいと思います。(一点からのみ、一方向のみ)。pclでそのようなことを行う方法は可能ですか(レイキャスタークラスは表示されますが、ポイントツーポイントではなく全世界で機能するようです)?