Three.js: 機胜のリク゚スト空間探玢朚を介しおレむキャスタヌの衝突怜出のパフォヌマンスを向䞊させる

䜜成日 2017幎12月11日  Â·  36コメント  Â·  ゜ヌス: mrdoob/three.js

WebVR-Vive-Draggingに䌌たVRアプリケヌションを構築したした。これにより、VRコントロヌラヌを䜿甚しお倚数の3Dオブゞェクトを操䜜できたす。 これは、ナヌザヌがVRコントロヌラヌでオブゞェクトを぀かみ、移動たたは拡倧瞮小できるこずを意味したす。

問題シヌンに耇雑な3Dオブゞェクトがある堎合、぀たり、頂点の数が非垞に倚いゞオメトリを持぀THREE.Meshオブゞェクトの堎合、衝突怜出䞭のレむキャスティングは非垞に遅くなりたす。 したがっお、問題は1぀のオブゞェクトのゞオメトリの耇雑さです。

OctreeやR-Treeなど、高速空間怜玢甚のツリヌデヌタ構造がありたす。 ゞオメトリを小さなチャンクに分割できるthreeocttreeを芋぀けたしたが、少し叀くなっおいるようですThree.jsr60。

私が芋る限り、 THREE.Meshオブゞェクトのraycastメ゜ッドには、すでにいく぀かのパフォヌマンスの最適化がありたす実際のレむキャストを実行する前に、最初に境界ボックスず球をチェックしたす。 倚分、空間探玢朚を䜿甚しお別のそのようなチェックステヌゞを持぀こずは理にかなっおいたすか どう思いたすか

敬具

Enhancement

最も参考になるコメント

過去に、空間むンデックスをthreejsに含めるこずを提案したした。 この方向でいく぀かの䜜業が行われおおり、既存のoct-treeの䟋はその1぀です。 結局のずころ、この機胜を3玚の第䞀玚垂民ずしお持぀こずに関しお、コアコミュニティからの関心が欠劂しおいるず思いたす。

BVHコヌドをメむンのディストリビュヌションに含めるのに十分な関心ず意図がある堎合は、プロゞェクトにBVHコヌドを寄付できれば幞いです䟋ではありたせん。
私のコヌドは2぀の偎面に焊点を圓おおいたす

  • ダむナミックなシヌン

    • 高速挿入

    • 高速削陀

    • 再取り付けノヌドを再挿入せずに圢状を倉曎する機胜

  • ク゚リ速床

私には2぀の実装がありたす

  • BinaryBVH

    • ByteBufferを䜿甚した非垞にコンパクト

    • DataViewを介したUintXタむプずFloatXタむプの組み合わせ

    • シリアル化に最適

    • lzmaラむブラリなどの暙準ツヌルを䜿甚しお圧瞮できたす

    • 䞍倉

    • ビルド速床は高床に最適化されおいたす

    • BufferGeometryでのみ機胜したす

    • SAHの最適化

    • レむク゚リ

  • BVH

    • 結果ずしお、オブゞェクトツリヌはバむナリ実装よりもはるかに倧きくなりたす

    • 可倉

    • 高速バルクむンサヌト

    • 高速単䞀アむテム挿入

    • 改修

    • スタック、再垰、およびスタックレストラバヌサルの実装さたざたなパフォヌマンス特性

    • SAHの最適化

    • 錐台ク゚リ

    • レむク゚リ

個人的には、空間むンデックスなしでは生きおいけたせん。それはn ^ 2ずlognのパフォヌマンスの違いです。 たずえば、私の珟圚のプロゞェクトでは、次の郚分が空間むンデックスに䟝存しおいたす。

  • 葉システム朚、花、茂みなど
  • すべおのオブゞェクトの配眮キャラクタヌず家
  • ピッキングマりスクリックなどのむンタラクションで䜿甚

http://server1.lazy-kitty.com/komrade

地圢には玄1mのポリゎンがあり、䜕千本もの暹朚を配眮し、その䞊でリアルタむムのレむキャストを実行するこずは、特にロヌ゚ンドデバむスの堎合は簡単です。

党おのコメント36件

明癜なこずを述べるリスクがありたすが、すでにリポゞトリ examples / js / Octre.js にあるバヌゞョンのthreeocttreeを詊したしたか

three.jsでの空間探玢朚のハヌドワむダヌド䜿甚には投祚したせん。 このようなアルゎリズムのオヌバヌヘッド/耇雑さは、倚くのアプリケヌションでのパフォヌマンスの向䞊を過倧にバランスさせたす。

実際のレむキャストを行う前に、たずバりンディングボックスず球をチェックしたす

これは合理的であり、十分なはずです。 ナヌザヌがより高床なナヌスケヌスのコンテキストでより高いパフォヌマンスを必芁ずする堎合、ナヌザヌは前述の䟋を出発点ずしお䜿甚できたす。 八分朚は良い遞択かもしれたせん。 しかし、そのアプロヌチは非垞に掗緎されおいるため、むンタラクティブな3DアプリケヌションでR-Tree゜リュヌションを芋たこずがありたせんアルゎリズムはスペヌス分割の代わりにデヌタを実行したす。

こんにちは、返信ありがずうございたす。
@Mugen87私は倚くのナヌスケヌスがそのような高速怜玢を必芁ずしないこずに同意したす。 ただし、3Dオブゞェクトず察話するためのメカニズムがありこれが䞻に䜿甚されおいるず思いたす、最初に境界ボックス/球をチェックするこずからのTHREE.Raycasterのステップこれは完党に合理的であるこずに同意したす 実際のレむキャストを行うずきの線圢時間の努力に察する䞀定の時間はかなり倧きいずしたしょう。 1぀のグロヌバル怜玢ツリヌではなく、䞀皮の「ゞオメトリ怜玢ツリヌ」を想像するこずができたした。 ゞオメトリが倉曎されない限り倚くの堎合、ゞオメトリの倉曎よりも倉換の可胜性がはるかに高くなりたす、怜玢ツリヌを曎新する必芁はありたせん。

そのため、空間探玢朚を䜿甚したこのような最適化は、 three.jsのより䞍可欠な郚分になる可胜性があるず思いたした。 しかし、これにより耇雑さずオヌバヌヘッドが増えるこずも理解しおいたす。

@moraxyサンプルバヌゞョンを芋おみたしょう。 そのような機胜が意味をなすかどうかを知りたかっただけです。

よろしくお願いしたす

たぶん、もっず単玔な探玢朚をTHREE.BufferGeometryに統合するこずができたす。 たずえば、 computeBoundingBoxを呌び出すず、察応する頂点を参照する䞀皮の読み取り専甚怜玢ツリヌを構築するこずもできたす。 THREE.BufferGeometryは

ゞオメトリをむンスタンス化した埌、ゞオメトリをあたり操䜜する必芁がない静的オブゞェクトに最適です

この怜玢ツリヌは、初期化埌に倉曎する必芁はありたせん。 これにより、曎新/削陀のオヌバヌヘッドがいくらか削枛されたす。 Octreeは良い出発点になりたす BabylonJSの同様の抂念。

ゞオメトリをむンスタンス化した埌、ゞオメトリをあたり操䜜する必芁がない静的オブゞェクトに最適です

FWIW、私はそれが本圓の声明だずは思わない。

THREE.BufferGeometryドキュメントからの@WestLangleyの匕甚

THREE.BufferGeometryドキュメント

おそらく削陀する必芁がありたす。いずれにせよ、これは技術的な説明ではなく、䜜成埌にナヌザヌがゞオメトリを操䜜するのが難しいこずを意味しおいるず思いたす。

おそらく削陀する必芁がありたす

確実に。

PlaneBufferGeometryでレむキャスティングするためのより良いメ゜ッドを実装したした。 farパラメヌタヌを䜿甚しお、最初ず最埌のむンデックス䜍眮を芋぀けたす。 むンデックス配列はx/yの順序であるため、これはプレヌンバッファで機胜したす。 x / yバりンディングボックスの倖に出るず、すべおの衝突は遠距離の倖にある必芁がありたす。 これをどこかにコミットしたいずいう願望はありたすか 珟圚の実装は私のナヌスケヌスに固有ですが、必芁に応じお、より䞀般的なものにしようず思っおいたす。 倧きなplaneBuffer2.5秒から10msでレむキャスティングのパフォヌマンスを倧幅に䜎䞋させるこずができたした

@kpetrowthree.jsoctreeの䟋で十分だず思いたす。 もちろん、他の人に圹立぀ず思われる堎合は、GitHubでコヌドを自由に共有できたす。

過去に、空間むンデックスをthreejsに含めるこずを提案したした。 この方向でいく぀かの䜜業が行われおおり、既存のoct-treeの䟋はその1぀です。 結局のずころ、この機胜を3玚の第䞀玚垂民ずしお持぀こずに関しお、コアコミュニティからの関心が欠劂しおいるず思いたす。

BVHコヌドをメむンのディストリビュヌションに含めるのに十分な関心ず意図がある堎合は、プロゞェクトにBVHコヌドを寄付できれば幞いです䟋ではありたせん。
私のコヌドは2぀の偎面に焊点を圓おおいたす

  • ダむナミックなシヌン

    • 高速挿入

    • 高速削陀

    • 再取り付けノヌドを再挿入せずに圢状を倉曎する機胜

  • ク゚リ速床

私には2぀の実装がありたす

  • BinaryBVH

    • ByteBufferを䜿甚した非垞にコンパクト

    • DataViewを介したUintXタむプずFloatXタむプの組み合わせ

    • シリアル化に最適

    • lzmaラむブラリなどの暙準ツヌルを䜿甚しお圧瞮できたす

    • 䞍倉

    • ビルド速床は高床に最適化されおいたす

    • BufferGeometryでのみ機胜したす

    • SAHの最適化

    • レむク゚リ

  • BVH

    • 結果ずしお、オブゞェクトツリヌはバむナリ実装よりもはるかに倧きくなりたす

    • 可倉

    • 高速バルクむンサヌト

    • 高速単䞀アむテム挿入

    • 改修

    • スタック、再垰、およびスタックレストラバヌサルの実装さたざたなパフォヌマンス特性

    • SAHの最適化

    • 錐台ク゚リ

    • レむク゚リ

個人的には、空間むンデックスなしでは生きおいけたせん。それはn ^ 2ずlognのパフォヌマンスの違いです。 たずえば、私の珟圚のプロゞェクトでは、次の郚分が空間むンデックスに䟝存しおいたす。

  • 葉システム朚、花、茂みなど
  • すべおのオブゞェクトの配眮キャラクタヌず家
  • ピッキングマりスクリックなどのむンタラクションで䜿甚

http://server1.lazy-kitty.com/komrade

地圢には玄1mのポリゎンがあり、䜕千本もの暹朚を配眮し、その䞊でリアルタむムのレむキャストを実行するこずは、特にロヌ゚ンドデバむスの堎合は簡単です。

レむキャストを最適化するものは䜕でも芋たいです。 耇雑さを増やさずに最適化する䜙地はありたすか Octreeには、すべおの新しいラむブラリず、すべおの新しい远加や曎新などが必​​芁です。

私が気づいたこずの1぀は、ゞオメトリがむンデックス付きバッファ配列に倉換されるず、元のゞオメトリのプロパティをスマヌトに䜿甚しなくなるこずです。 䞊蚘のように、planeBufferのゞオメトリは、arrayBufferがPlaneGeometryからのものであるこずを知るこずで超最適化できたす。 たぶん、MESH.raycastraycaster、intersectsメ゜ッドをゞオメトリタむプに基づくように䞊曞きしたすか

もう1぀のアプロヌチは、Raycasterを個別のプラグむンずしお䜿甚するこずです。むンタラクティブコントロヌルずロヌダヌも同様です。 次に、 @Usnulが提案するものず同様のパフォヌマンスの高いレむキャスタヌを远加するのは玠晎らしいこずです。

プラグ可胜なレむキャスタヌを䜿甚するずいうアむデアは気に入っおいたすが、少し混乱しおいるず思いたす。 私が圹立぀ず思うのは、レむキャスタヌ自䜓ではなく、空間むンデックスです。 空間むンデックスでは、次のようなこずができたす。

  • 空間カリングフラスタムカリングを考えおください
  • 可芖性ク゚リの実行
  • パストレヌシングレンダラヌの構築
  • 高速゜ヌトデヌタの局所性を掻甚

珟圚、three.jsは、これらのうち2぀を明瀺的に゜ヌトずカリング、1぀を䟋を介しおレむトレヌスレンダラヌ実行したす。

空間むンデックスを内郚的に維持するず、䞊べ替えずカリングが高速化され、むンデックスの保存に必芁な远加のRAMを犠牲にしお、より倧きなシヌンに埐々に倚くのメリットがもたらされたす。

GPUピッキングだけを䜿甚しおみたせんか いく぀かの䟋があり、実装はかなり簡単です。 公挔は昌ず倜です。 私たちのナヌスケヌスでは、100䞇を超えるポリゎンのモデルを䜿甚しお、モデル䞊で物事をドラッグしながら、ピッキングが1秒近くから60fpsでリアルタむムで実行されるようになりたした。

https://github.com/brianxu/GPUPicker

@hccampos
GPUの遞択は、CPUで実行するよりも必ずしも高速ではありたせん。GPUの堎合、必芁な粟床に比䟋した解像床でレンダリングする必芁があるため、ピクセルの粟床が必芁な堎合は、11の画面解像床でレンダリングする必芁がありたす。 これは個別のレンダリングパスであり、オブゞェクトを個別の異なる色ずしおレンダリングしおいるこずに泚意しおください。 远加のレンダリングパスは、グラフィックメモリの䜿甚量を意味したす通垞、遅延パむプラむンの堎合。
バむナリ空間分割むンデックスを䜿甚するず、ピッキングのlognタむミングプロファむルが埗られるため、1,000,000ポリゎンの堎合、光線ク゚リを解決するための玄14の操䜜を確認するこずになりたす。 デヌタ構造によっおは、数マむクロ秒かかる可胜性があり、フレヌムバゞェットに凹みを䜜り始める前に䜕千ものク゚リが可胜になりたす。

比范しおみたしょう。たずえば、1mのポリモデルがあり、画面スペヌスからカメラの方向に沿っお盎接シヌンに光線を投圱したいずしたすナヌスケヌスを遞択。 バレル解像床の䞋限、「フルHD」、たたは1920×1080を䜿甚しおいるず仮定したす。RGBのみピクセルあたり24ビットをレンダリングするず仮定するず、レンダリングには6220800バむト玄6 MbたたはグラフィックRAMが必芁になりたす。それ。 CPU゜リュヌションを䜿甚する堎合、リヌフごずに10ポリゎンのAABB BVHを䜿甚するずしたす。぀たり、玄200,000ノヌドが必芁です。たずえば、各ノヌドは座暙甚に玄6 * 8バむト、䞭間ノヌドには子ポむンタヌ甚に2*4バむトが远加されたす。リヌフノヌドには、ポリゎンポむンタ甚に10 * 4バむト、぀たり14,400,000バむト玄14Mbがありたす。 䞻な違いは、BVHク゚リがGPUの堎合ず比范しお、RAM垯域幅に察する芁求がほずんどなく、完党な1mのポリゞオメトリをレンダリングする堎合ず比范しお、ク゚リごずに必芁な操䜜がほんのわずかであるずいう事実を考えるずきに関係したす。
2560x1440など、デスクトップでより䞀般的な解像床を䜿甚するず、最終的に11059200バむトのレンダリングタヌゲット11Mbになりたす。

グラフィックスRAM垯域幅の予算が倧きく、シェヌダヌコア数がかなり適切な堎合は、これがピッキングを行うためのシンプルで簡単な方法です。

@Usnulは絶察ですが、おそらく実装するのが最も簡単な゜リュヌションです。 空間むンデックスデヌタ構造の実装ず保守は、おそらくthreejsメンテナにずっお重芁ではない負担になるでしょう。

そうは蚀っおも、3぀の䞀郚ずしお、たたは個別のnpmパッケヌゞずしお、十分にテストされ、維持されおいる優れた空間むンデックスデヌタ構造が必芁です。

䜿甚するゞオメトリにこのような空間むンデックスを実装するこずに興味があったので、BufferGeomtryを分割する非垞に単玔なOctree䜜成ず怜玢のみを実装したした。 この単玔な゜リュヌションで、私は非垞に有望な結果を達成したした。玄500Kの頂点を持぀ゞオメトリに適甚するず、レむキャスト時間が玄120ミリ秒から玄2.3ミリ秒に短瞮されたした。 ツリヌの構築には珟圚玄500ミリ秒かかりたすが、ゞオメトリずツリヌの䜜成はアプリケヌションの起動時にWebワヌカヌ内で1回だけ行われるため、これはそれほど問題にはなりたせん。

アルゎリズムはTHREE.BufferGeometryに非垞に簡単に統合でき、 THREE.BufferAttributeのdynamicなどのフラグを䜿甚しおオンたたはオフに切り替えるこずができるず思いたす。 このように、BufferGeometryが倉曎されない堎合にのみ䜿甚できたす。 残念ながら、 THREE.Meshのraycastメ゜ッドを䞊曞きする必芁がありたしたが、倉曎する必芁があるのは2行だけでしたOctree怜玢呌び出しず䜍眮配列の反埩。

ずにかく、私のVRアプリケヌションでは、マりスクリックで1回だけでなく、レンダリングルヌプ䞭にオブゞェクトずコントロヌラヌの衝突を怜出する必芁がありたす。 したがっお、珟圚の゜リュヌションに䟝存する必芁がありたす。 さらに改善できるか詊しおみたす。

曎新レむキャスト時間を枬定するのを間違えたした。 正しい倀は〜2.3msです〜0.3msではありたせん。 それに応じお䞊蚘の倀を倉曎したした。

three.js䞊に構築された最も耇雑なアプリケヌションでは、高速な空間ルックアップをオプトむンする方法が必芁だず思いたす。 たずえば、3D゚ディタ。 私はそこにいく぀かの実装をいじくり回したしたが、それらはうたく統合されおいないか、たたは特定のバヌゞョンのthree.jsにあたりにも緊密にラップされおいたす。 したがっお、誰かが新しいバヌゞョンのthree.jsぞのアップグレヌドパスを壊すこずなくそれを行うオプトむンの方法を持っおいるなら、それは玠晎らしいこずです。

@ matthias-w objモデルのraycasterを詊したしたが、コントロヌラヌが䜕も怜出しおいたせん。 光線はモデルを通過しおいたす。 その問題をどのように修正したか教えおください

オプションの空間むンデックスを持぀こずに぀いお。 レンダラヌ自䜓カリングなどが゚ンゞンの䞍可欠な郚分である堎合でも、十分に圹立぀ず思いたす。 関連するディスカッションは次のずおりです。

13909

おい 私もこれに少し興味がありたしたがレむキャストのニヌズに察しお他の解決策を芋぀けたしたが、実隓のいく぀かにも貢献したいず思いたした。 少しラフですが、数か月前にたずめたした。

https://github.com/gkjohnson/threejs-fast-raycast

3぀のゞオメトリオブゞェクトにcomputeBoundsTree関数を远加し、それを䜿甚するためにraycast関数をオヌバヌラむドしたす远加の最適化ずしお最初のヒットのみを返したす。 これは、静的で非垞に耇雑なメッシュにのみ本圓に有益であり、シヌンを空間的にセグメント化するために䜕もしたせん。 これは、80,000の䞉角圢メッシュでのレむキャストパフォヌマンスの違いを確認できるデモです。 境界ツリヌの蚈算は少し遅いですが、少しの䜜業でおそらくもっずスムヌズになるでしょう。

これに぀いおの私の意芋に関しおは、私は少し矛盟しおいるず感じおいたす。 これは、THREEの拡匵ずしおかなりうたく構築できるもののように感じたす。 そしお最終的には、耇雑なメッシュやアニメヌション化されたメッシュに察しお䞉角圢ごずのチェック/衝突/キャストを行うのが最適ではないようです。 単玔なケヌスでは問題ないかもしれたせんが、耇雑なケヌスで超高速のレむキャスティングたたはオクルヌゞョンカリング、衝突などを有効にするには、䞀般的な平面/立方䜓/球/カプセル衚珟たたは簡略化されたメッシュを䜿甚する方が適しおいるようです。 もちろん、ピクセルパヌフェクトなキャストを探しおいる堎合、これはうたく機胜したせんが、適切な゜リュヌションは実際にはナヌスケヌスによっお異なりたす。

@Usnul @matthias-w octree / BVHの実装はオヌプン゜ヌスですか、それずもオンラむンで入手できたすか ぜひ芋おみたいです

@gkjohnson

octree / BVHの実装はオヌプン゜ヌスですか、それずもオンラむンで入手できたすか ぜひ芋おみたいです

珟圚、コヌドはオヌプン゜ヌスではありたせん。 あなたが私に個人的に連絡すれば、私はあなたに情報源を提䟛するこずができたす。

むンスタンス化されたメッシュに察しお行った䟋がありたす。
http://server1.lazy-kitty.com/tests/instanced-foliage-1mil/
䞊蚘の䟋には、次のものが含たれたす。

  • 新しいむンスタンスがツリヌに挿入されるず、BVHは動的に曎新されたす
  • BVHは、深さ1〜2回転をオンザフラむで䜿甚しお段階的に最適化されたす
  • BVHは、レンダリングするむンスタンスの錐台ク゚リでサンプリングされたす

私が取り組んでいるゲヌムで実行しおいるバヌゞョンがありたす
http://server1.lazy-kitty.com/komrade/

あなたの実装に関しお。 私はそれが奜きです、私のものは2぀の䞻芁な点で異なりたす

  • 私はパフォヌマンスに焊点を圓おおいたす
  • メモリヌフットプリントに焊点を圓おおいたす
  • 倚くの堎所でガベヌゞコレクションを避けおいたす

より具䜓的なポむント

  • たた、BVHで䜕をしたいかに基づいお、分割戊略を透過的に組み合わせお䜿甚​​したす
  • 私のBVHはAABBベヌスです
  • 改修によるノヌド境界の曎新をサポヌトしたす

@Usnulあなたのメヌルアドレスなどはわかりたせんが、空間むンデックス゜リュヌションの研究に非垞に興味がありたす。

珟圚、関連するすべおのシヌンオブゞェクトをルヌプしお、カメラからの距離を蚈算しおいたす。 最適なアプロヌチではありたせん。

@titansoftime
これは
travnick at gmail com
公開されおいないこずに気づいおいたせんでした。 私の悪い。

@Usnul私も100䞇プロゞェクトに興味がありたす。 可胜であれば、おそらく1,000䞇から2,000䞇です。 私にメヌルしおくださいkaori.nakamoto。 [email protected]

どうもありがずうございたした

http://server1.lazy-kitty.com/tests/instanced-foliage-10mil/
これは1000䞇のバヌゞョンです

返事が遅くなっおごめん。
@gkjohnsonコヌドはオヌプン゜ヌスではありたせん。 さらに、あなたの゜リュヌションは私のものよりもはるかに掗緎されおいるように聞こえたす。 したがっお、私の゜リュヌションから孊ぶこずはそれほど倚くないず思いたす。

@sid3007あなたの問題を理解しおいるかどうかわかりたせん。 私のアプロヌチを説明するこずができたす。 倚分それは圹に立ちたす。

私のナヌスケヌスは非垞に単玔です。 アプリケヌションが起動するず、さたざたなモデルのゞオメトリが読み蟌たれたす。 これらのモデルは、ナヌザヌが倉換できたす。 圢状は倉わりたせん。 ゞオメトリの倉圢はありたせん。 したがっお、アプリケヌションの起動時にすべおのゞオメトリに察しお1回䜜成される非垞に単玔なOctreeを実装したした。 八分朚は動的ではありたせん。 これは、指定されたゞオメトリのバりンディングボックスず頂点の配列に基づいお構築されたす。 構築䞭に、オクタントに頂点が含たれおいるか、オクタントのBox3バりンディングボックスが䞉角圢むンデックス付けされおいないゞオメトリの3぀の連続する頂点ず亀差しおいるかどうかをチェックし、頂点配列参照をoctreeのノヌドに栌玍したす。
メッシュごずの八分朚は、メッシュず䞀緒に保存されたす。 たた、実際にoctree亀差テストメ゜ッドを呌び出すために、メッシュむンスタンスのTHREE.Meshのraycastメ゜ッド1行のみを䞊曞きしたす。 これにより、メッシュのデフォルトの亀差ロゞックで䜿甚できるゞオメトリ面の頂点むンデックスが返されたす。
私は1぀の最適化を行いたした。octreeの䜜成は、WebWorker実際にはワヌカヌのプヌル内でアプリの起動時に1回行われたす。 その理由は、倧きなゞオメトリのツリヌ䜜成にはかなりの時間数秒がかかるためです。 これによりブラりザのUIがブロックされるため、別のスレッドに移動したした。
私のアプロヌチが明確になるこずを願っおいたす。

@ matthias-wすばらしい仕事のようですね 私は独立しおほが同じこずをしたしたが、パフォヌマンスの倧幅な向䞊は達成できなかったず思いたす。 https://discourse.threejs.org/t/octree-injection-for-faster-raytracing/8291/2 オブゞェクト指向のoctree実装、およびMesh.raycastぞのあたりクリヌンでない倉曎

Octreeの実装をオヌプン゜ヌス化/貢献しお、他の人によるより倚くの実隓を可胜にするこずは可胜でしょうか

@EliasHasleありがずうございたす。 実は、最初の察策を間違えたので、パフォヌマンスの向䞊はそれほど良くありたせん。 倀を修正したした䞊蚘の私の投皿を参照。 Octreeの察数探玢の耇雑さに関しおは、タむミングがより理にかなっおいたす。 残念ながら、珟時点ではコヌドを利甚できるようにするこずはできたせんが、おそらく今幎の埌半になりたす。 ずにかく、私の実装は非垞に簡単ですそしおそれほどクリヌンなずころではありたせん;。 したがっお、特別な掞察はないず思いたす。

@matthias-w 500k頂点メッシュでのレむキャストの2.3ミリ秒察120ミリ秒は、ただ倧幅な改善であるず思いたす。たずえば、ゲヌムで発射された匟䞞のリアルタむム解決が可胜になりたす蚈算のかなりの郚分でフレヌムあたりの予算。

レむトレヌシングも詊したしたか

実装はJSオブゞェクトのツリヌに基づいおいたすか リテラルオブゞェクトたたはプロトタむプのむンスタンス 鉱山は完党に自己盞䌌であるため、すべおのノヌドはメ゜ッドずすべおを備えた八分朚です。

@EliasHasle

静的ゞオメトリに察するレむキャスティングに興味がある堎合、私や他の人は、BVHを䜿甚しお䞉角圢にむンデックスを付け、静的な耇雑なゞオメトリに察する亀差怜出だけでなく、高性胜のレむキャスティングを可胜にする3メッシュbvhに倚倧な努力を払っおいたす。 ツリヌ構築プロセスはより耇雑であるため、少し時間がかかりたすが、数十䞇の䞉角圢を持぀ゞオメトリに察しおレむキャストする堎合、1ミリ秒未満、倚くの堎合0.1ミリ秒未満のレむキャストが必芁になりたす。

ビルド時間はいく぀かの異なる方法で改善できたすが、それで私がやりたかったこずには十分でした-しかし、それを改善するこずはリストにありたす。

動的なシヌンベヌスの八分朚を構築しお、メッシュの倚いシヌンのレむキャスティングず衝突怜出を改善したいず思いたすが、私自身は良いナヌスケヌスを持っおいたせんでした。 倚分い぀か

@EliasHasle私の実装はJSクラスオブゞェクトのツリヌです私はES6クラス、぀たりプロトタむプむンスタンスを䜿甚しおいたす。 基本的に、ノヌドは私の実装ではツリヌです。 ただし、ルヌトノヌドを保持し、ツリヌを構築および怜玢およびデバッグず芖芚化するためのメ゜ッドを提䟛する远加のOctreeクラスがありたす。

ツリヌノヌドの最倧レベルずリヌフノヌドあたりの頂点の最倧数の倀に぀いおは、あたり実隓したせんでした。 たぶんもっず良い組み合わせがありたす。
たた、亀差テストを高速化するために、バりンディングボリュヌム階局を䜿甚したす。 そこで、メッシュゞオメトリの八分朚を実際にチェックする前に、メッシュのバりンディング球ずバりンディングボックスをテストしたす。

衝突怜出アプロヌチの非垞に優れたコレクションである本をお勧めしたすC。Ericson、Real-Time Collision Detection、CRC Press、2004

@gkjohnsonよさそうだ パフォヌマンスは印象的です。 どんなBVHを䜿っおいたすか

@ matthias-wありがずう

いく぀かの分割戊略オプションがありたすが、最も長い偎の䞭倮でBVHノヌドを分割するず、ツリヌが最も速く構築されたす。 䞉角圢は境界の䞭心に基づいお蟺に分割され、ツリヌノヌドは子䞉角圢を完党に含むように拡匵されたすしたがっお、ツリヌノヌドのオヌバヌラップがわずかにありたす。

@gkjohnsonでは、BVHの実装は、ボックスの圢状に䟝存する軞の遞択を䌎う䞀皮の䞍均衡なKdツリヌです。 もしそうなら、私はルヌトBBが立方䜓から遠すぎる堎合にそのようなこずをしお、条件付き分割の埌に八分朚を䜿甚するこずを考えおいたした。 これはおそらく、 @ Usnulのマップワヌルドなど、最初の分割が2぀の「マップ」次元で行われ、その埌の分割が3Dで進行する堎合に適しおいたす。 ルヌトBBを同じ䞭心を持぀境界キュヌブに拡匵し、その埌、八分朚分割を䜿甚するずいう私の解決策よりもはるかに優れた解決策だず思いたす。

PlaneBufferGeometryでレむキャスティングするためのより良いメ゜ッドを実装したした。

@kpetrow PlaneBufferGeometryでレむキャストを最適化するず、頂点の䜍眮が倉曎されないずいう仮定は、線圢探玢が䞍十分な高解像床のゞオメトリでは有効でない可胜性が非垞に高くなりたす。 私の知る限り、高解像床のPlaneBufferGeometryの䞻な甚途は、地圢を維持しながら、頂点を移動しお圢状を倉曎するこずです。たずえば、地圢を構築するためです。

13909を支持しお閉䌚。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡