問題タブ [marching-cubes]

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 投票する
1 に答える
4160 参照

c++ - マーチング キューブ、ボクセル、少し提案が必要

研究目的のためだけに、適切な破壊可能な地形を構築しようとしています。まあ、すべてうまくいきましたが、解像度は私を十分に満足させるものではありません. MC アルゴリズムを実装する例をたくさん見てきましたが、私が理解している限り、それらのほとんどは関数を使用して最終メッシュを三角測量しており、これは私には適切ではありません。

地形をどのように構築しているかを簡単に説明しようと思います。最終的な地形の解像度を改善または向上させる方法を提案してくれる人がいるかもしれません。

1) MC 三角形の事前計算。

各ケース (0-255) の MC ルックアップ テーブルを介して単純なループを実行し、[0,0,0] - [1,1,1] の三角形を計算しています。ここでは問題ありません。

2) 地形

ボクセルを保存する地形クラスがあります。一般に、次のようになります。

したがって、各軸は 32 単位の長さですが、ビットごとにボクセル情報を格納します。つまり、ビットがオン (1) の場合、何かがあり、何かを描画する必要があります。

私はいくつかの機能を持っています:

ボクセルの位置をオンまたはオフにします。(ビットの操作に役立ちます)。

地形が割り当てられたら、パーリン ノイズを実行し、ビットをオンまたはオフにします。

私の地形クラスには、x、y、z の位置からマーチング キューブのケース番号 (0 ~ 255) を抽出する関数がもう 1 つあります。

そのボクセルの隣人がオンかオフかを決定することによって。ここでは問題ありません。

3) レンダリング部分

軸ごとにループし、ケース番号を抽出してから、事前に計算された三角形をケースごとに取得し、x、y、z 座標に変換して、それらの三角形を描画します。ここでは問題ありません。

したがって、結果は次のようになります。

地形

しかし、ご覧のとおり、どの単一の場所でも、解像度はたとえばこれに匹敵しません: (ソース: angelfire.com )MC

MC の例で、人々が「iso 値」と呼ばれるものを使用しているのを見たことがありますが、これは私には理解できません。私の仕事を改善する方法、または iso 値とは何か、それを均一なグリッドに実装する方法についての提案は本当に素敵です。

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

terrain - ボクセルベースの地形の適切な密度関数?

私はなんとかC#でマーチングキューブアルゴリズムを実装することができました。これまで、球をレンダリングするアルゴリズムを試しました。密度関数のコーディングはそれほど複雑ではないため、これは簡単な方法です。

しかし今、私はアルゴリズムをさらに進めて、ゲームのためにいくつかの興味深い地形をレンダリングしたいと思っています。したがって、このタスクには適切な密度関数が必要です。私の頭に浮かぶ最初のことは、体積パーリンノイズです。それは大丈夫ですが、私は凸状の形のない地形を探しています。つまり、現時点では洞窟や同様の形状はありません。

わかりました。そのためには、単純な高さマップで十分ですが、ボクセルで生成された地形が必要です。それらを実装するには、どのタイプの密度関数または擬似コードが必要ですか?

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

algorithm - マーチングキューブのあいまいさ対マーチング四面体

マーチングキューブアルゴリズムの実装に成功しました。標準資料を参考にしましたが、一から書き直しました。それは機能しますが、メッシュに穴を開ける原因となるあいまいさを観察しています。

あいまいさの影響を受けないと思われるマーチング四面体アルゴリズムを検討していました。これがどのように可能かわかりません。

マーチング四面体アルゴリズムは、立方体の代わりに6つの四面体を使用し、各四面体に三角形分割を使用します。しかし、マーチングキューブアルゴリズムを実装するとしますが、256の三角形分割のそれぞれについて、立方体の四面体の三角形分割の「合計」(和集合)であるものを選択するだけですか?私の知る限り、これは行進する四面体が行うことです-それで、なぜそれが曖昧さを魔法のように修正するのですか?

16のユニークなケースがあると思いますが、他の240は、それらの16の反射/回転にすぎません。あいまいさを解決するには33のケースが必要であるという論文をどこかで読んだことを覚えています。これは、四面体の行進がどういうわけか問題に悩まされない理由に関連しているのでしょうか?

だから、質問:

  1. マーチング四面体があいまいさに悩まされないのはなぜですか?
  2. そうでない場合は、マーチングキューブアルゴリズムを使用せず、代わりに四面体の三角形分割を使用するのはなぜですか?

ここで何かが足りないような気がします。ありがとう。

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

c# - ノイズを使用してマーチングキューブ地形を生成しますか?

C#XNAでマーチングキューブクラスを作成し、Libノイズを使用して3dパーリンノイズを生成していますが、マーチングキューブの密度としてパーリンノイズの値を使用して地形を生成しようとすると、一見ランダムな三角形が内部にあるマーチングキューブ。マーチングキューブを分離し、密度の任意の3D配列を指定して、すべてが機能し、正常に見えることを確認しました。地形生成コードで通常の立方体を生成し、通常の外観の地形を取得しましたが、問題が発生しました。は、各キューブのコーナーがノイズから値を取得するため、マーチングキューブがごちゃごちゃしたように見えるほど速く、常に負から正に切り替わります。

これは、地形を生成するために使用しているコードです。

GetDensityメソッドは次のとおりです。

問題は、マーチングキューブの角の密度を取得するためにノイズを正しく使用していないことだと思いますが、これまでのところ、私のグーグル検索結果はまったく役に立ちませんでした。では、ノイズを適切に使用して滑らかな地形を生成する方法を知っている人はいますか?または、他に何がこの問題を引き起こしている可能性がありますか?

スクリーンショットをhttp://imgur.com/a/D1uMCに投稿しまし た。最初の2つはマーチングキューブを使用して表示され、最後の1つは通常のキューブです。

編集:マーチングキューブが実際に与えられた値で想定どおりに機能していることが写真からわかりました。問題は私のノイズとそれをどのように使用しているかに反抗しています。誰かが良いリソースを知っていますか?ノイズに基づく3D地形生成の場合?

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

c++ - マーチングキューブ(C ++からC#)

マーチングキューブをC#で実装しようとしていますが、アルゴリズムが理解できず、実装方法がわからない部分に到達しました。

int Polygonise(GRIDCELL grid, double isolevel, TRIANGLE *triangles)

私が本当に理解していない3番目の議論。私はそれがポインタであることを知っていますが、後でアルゴで三角形を設定すると、変数が構造体trianglesの配列であるかのように見えます。TRIANGLE

に注意してtriangles[ntriang]ください。trianglesに設定する前なので、それは意味がありませんTRIANGLE *triangles。なぜそれがポインタなのかもわかりません。

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

opengl - glDrawArraysがGL_INVALID_OPERATIONエラーを生成する原因は何ですか?

私は、OpenGLとGLSLを使用して、GPU Gems3の最初の章で詳しく説明したものと同様のマーチングキューブアルゴリズムの2パスGPU実装を作成しようとしています。ただし、glDrawArrays最初のパスでのへの呼び出しは、一貫して。で失敗しますGL_INVALID_OPERATION

私は見つけることができるすべてのドキュメントを調べて、glDrawArraysそのエラーをスローする可能性があるこれらの条件を見つけました:

  1. GL_INVALID_OPERATIONゼロ以外のバッファオブジェクト名が有効な配列またはGL_DRAW_INDIRECT_BUFFERバインディングにバインドされており、バッファオブジェクトのデータストアが現在マップされている場合に生成されます。
  2. GL_INVALID_OPERATIONの実行と対応するglDrawArraysの実行の間に実行された場合に生成されます。glBeginglEnd
  3. GL_INVALID_OPERATION現在のプログラムオブジェクト内の2つのアクティブなサンプラーが異なるタイプであるglDrawArraysかどうかによって生成されますが、同じテクスチャ画像ユニットを参照します。glDrawElements
  4. GL_INVALID_OPERATIONジオメトリシェーダーがアクティブで、モードが現在インストールされているプログラムオブジェクトのジオメトリシェーダーの入力プリミティブタイプと互換性がない場合に生成されます。
  5. GL_INVALID_OPERATIONモードがGL_PATCHESあり、テッセレーション制御シェーダーがアクティブでない場合に生成されます。
  6. GL_INVALID_OPERATIONプリミティブの頂点を変換フィードバックの目的で使用されているバッファオブジェクトに記録すると、バッファオブジェクトのサイズの制限を超えるか、で設定されている終了位置オフセット+サイズ-1を超える場合に生成されglBindBufferRangeます。
  7. GL_INVALID_OPERATIONglDrawArrays()ジオメトリシェーダーが存在せず、変換フィードバックがアクティブであり、モードが許可されたモードの1つではない場合に生成されます。
  8. GL_INVALID_OPERATIONglDrawArrays()は、ジオメトリシェーダーが存在し、変換フィードバックがアクティブであり、ジオメトリシェーダーの出力プリミティブタイプが変換フィードバックprimitiveModeと一致しない場合に生成されます。
  9. GL_INVALID_OPERATIONバインドされたシェーダープログラムが無効な場合に生成されます。
  10. 編集10/10/12: GL_INVALID_OPERATION変換フィードバックが使用されている場合に生成され、変換フィードバックバインディングポイントにバインドされたバッファーも配列バッファーバインディングポイントにバインドされます。これは、私がバインドしたバッファーのタイプミスが原因で発生していた問題です。仕様にはこれは違法であると記載されていますが、私が見つけたドキュメントでは、エラーをスローする理由の1つとしてglDrawArraysの下にリストされていません。

残念ながら、私が見つけることができる公式のドキュメントの1つは、これらのうち3つ以上をカバーしていません。私はこのリストを多くの情報源から収集しなければなりませんでした。ポイント7と8は、実際にはのドキュメントに基づいてglBeginTransformFeedbackおり、ポイント9はまったくドキュメント化されていないようです。どこかのフォーラム投稿で言及されているのを見つけました。しかし、私が得ているエラーを説明しているようには見えないので、このリストはまだ完全ではないと思います。

  1. 私は自分のプログラムのどこにも、バッファをまったくマッピングしていません。
  2. 私はコアプロファイルを使用しているのでglBeginglEnd利用できません。
  3. 私は2つのサンプラーを持っていて、それらは異なるタイプですが、それらは間違いなく異なるテクスチャーにマッピングされています。
  4. ジオメトリシェーダーはアクティブですが、その入力レイアウトはlayout (points) inであり、glDrawArraysで呼び出されていGL_POINTSます。
  5. 私はGL_PATCHESいかなる種類のテッセレーションシェーダーも使用していません。
  6. ジオメトリシェーダーが出力できる最大のスペースを割り当てていることを確認しました。それから私はそれを4倍にしてみました。助けにはならなかった。
  7. ジオメトリシェーダーがあります。次のポイントを参照してください。
  8. 変換フィードバックが使用されており、ジオメトリシェーダーがありますが、出力レイアウトはlayout (points) outglBeginTransformFeedback呼び出されGL_POINTSます。
  9. glValidateProgramの呼び出しの直前にへの呼び出しを挿入しようとしましたglDrawArraysが、が返されGL_TRUEました。

実際のOpenGLコードは次のとおりです。

実際のエラーは、の呼び出しglDrawArraysですRenderPass1。とへの呼び出しをコメントアウトするglBeginTransformFeedbackglEndTransformFeedbackglDrawArraysエラーの生成が停止することに注意してください。ですから、何が悪いのかは、おそらく何らかの形で変換フィードバックに関連しています。

8/18 / 12、午後9時を編集:

gDEBuggerでNVIDIAGLExpert機能を見つけましたが、これは以前はなじみがありませんでした。これをオンにするとGL_INVALID_OPERATION、特に、に関するより実質的な情報が得られましたThe current operation is illegal in the current state: Buffer is mapped.。だから私は上記のポイント1にぶつかっています。どうすればいいのかわかりませんが。

glMapBufferコードのどこにも、、または関連する関数の呼び出しはありません。、、、、およびへglMapBufferの呼び出しで中断するようにgDEBuggerを設定しましたが、どこでも中断しませんでした。次に、最初にコードを追加して、煩わしいバッファを明示的にマップ解除しました。エラーが消えなかっただけでなく、両方を呼び出すとが生成されます。それで、私が使用しているバッファのどちらもマップされていない場合、エラーはどこから来ていますか?glMapBufferARBglMapBufferRangeglUnmapBufferglUnmapBufferARBRenderPass1glUnmapBufferThe current operation is illegal in the current state: Buffer is unbound or is already unmapped.

8/19 / 12、午前12時に編集:

gDEBuggerのGLExpertから表示されるエラーメッセージに基づくと、呼び出しによってglBeginTransformFeedback、バインドされたバッファGL_TRANSFORM_FEEDBACK_BUFFERがマップされるようになっているようです。具体的には、「テクスチャ、バッファ、画像ビューア」でバッファをクリックすると、メッセージが出力されますThe current operation is illegal in the current state: Buffer must be bound and not mapped.。ただし、これをとの間に追加するglBeginTransformFeedbackglEndTransformFeedback

0を出力します。これは、GL_TRANSFORM_FEEDBACK_BUFFERマップされていないことを示します。このバッファが別のバインディングポイントにマップされている場合でも、これは0を返しますか?なぜglBeginTransformFeedbackバッファをマップして、変換フィードバックに使用できないようにするのでしょうか。

ここで学べば学ぶほど、混乱していきます。

10/10/12を編集:

以下のNicolBolasの解決策への返信に示されているように、私は問題を見つけました。それは彼が見つけたものと同じです。愚かなタイプミスのため、同じバッファーを入力と出力の両方のバインドポイントにバインドしていました。

質問を投稿してからおそらく2週間後に見つかりました。私はしばらくの間欲求不満をあきらめ、最終的に戻ってきて、基本的にすべてを最初から再実装し、古い、機能していないものを定期的に比較しました。私が終わったとき、新しいバージョンは機能しました、そして私が間違ったバッファをバインドしていたことを発見したのは違いを調べたときでした。

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

vtk - vtkMarchingCubes は nifti サーフェスを Wavefront OBJ にエクスポートします

nifti ラベル セットで vtkMarchingCubes を実行したいと考えています。サーフェスを生成したいボクセルの領域はすべて同じ値を共有します。2 つの問題があります。まず、結果の vtkPolyData には明らかに頂点がないため、アルゴリズムを正しく設定していないようです。次に、vtkOBJExporter のドキュメントから、vtkPolyData を wavefront .OBJ ファイルとしてエクスポートする方法がわかりません。以下のコードに問題がある場合、または vtkPolyData を OBJ としてエクスポートする方法を教えていただける場合は、よろしくお願いします。

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

opengl - 頂点法線を補間する方法は?

マーチングキューブアルゴリズムを使用して、グーローシェーディングを使用して(volvis.orgの)3Dモデルをレンダリングしようとしています。これまでのところ、各頂点の法線は次のようになっています。

レンダリングすると、フラットなシェーディングが見られます。さて、私が知る限り、これらの頂点法線を補間して、グーローシェーディングを取得するために交点で法線を見つける必要があります。頂点法線をどのように補間できますか?

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

c++ - getdepth 関数は MarchingCube アルゴリズムでどのように機能しますか?

マーチング キューブ アルゴリズムを理解しようとしているので、三角形がどのように形成され、各グリッドで法線がどのように計算されるかを理解していると思います。各グリッドを別のグリッドにリンクするリンク リストのような構造があることがわかります。しかし、各三角形 (各グリッドの三角形) (t[0],..,..) を個別に渡す GetDepth(t[m]) に遭遇すると、ノードの深さを返します。

関数、

最大zを見つけようとしているようです(本当ですか)。「 > 」を比較すると、それが失われたことがわかります。ここで何が起こっているのか説明してください。