床や壁といった他のオブジェクトと当たり判定を取るためにNiagaraDataInterfaceのAsyncTraceGpuが提供するCreateAsyncRayTraceGpuノードを使用していますが、パーティクル同士と判定を取ってしまうのでCollisionGroupに値を入れて判定をスキップしようとしています。
予めSetComponentNiagaraGPURayTracedCollisionGroupを使用し、スキップする対象のNiagaraComponentにCollisionGroupの番号を設定しており、CreateAsyncRayTraceGpuのCollisionGroupにスキップしたいグループIDを設定して運用しているのですが、パーティクル同士で当たり判定を取ってしまいます。
もし正しい使い方がありましたらご教示いただけますと幸いです。
なお、使用しているバージョンはUE5.6.1です。
同バージョンの純正UEでも、同様の事象が確認されました。
[Attachment Removed]
お世話になっております。
AsyncTraceGpuはExperimental機能ということもあり不安定な点はありますが、ご要件の範囲では正常に動作いたしました。
サンプルプロジェクトを添付しましたので、ご参照ください。
まず前提としまして、AsyncTraceGPUではパーティクル同士のコリジョンを取ることができません。
ただし、組み込み方を間違えるとReadAsyncRayTraceGpuで正しくクエリに対応したヒット情報を読み取れず、パーティクル生成直後などに別の箇所のヒット情報を読み取ってヒット判定が出てしまい、パーティクル同士が衝突しているように見える、ということはありました。
またPIEではない、エディタ状態では動作が変わってくるため、仕様通り動作しないように見える場合があります。ご面倒ですが、必ずPIEでご確認ください。
■添付プロジェクトの見方
添付のサンプルでPIEを実行しますと上から厚めのプレートを突き抜ける形で多量のパーティクルがばら撒かれます。
このパーティクルのCollisionGroupはデフォルトで1に設定されており、上部のプレートは-1に設定されています。
パーティクルが衝突を検出すると、パーティクルの色が赤に変わり、衝突地点に上向きのデバッグ矢印を出します。
従って、初期状態では、下図のとおりプレートと床の両方でヒットの検出が見られます。
[Image Removed]
キーボードの1、2、3でプレートのCollision Groupを対応する数値のものに変えられるよう作ってあります。
1を押すと、パーティクルのCreateAsyncRayTraceGpuで使用するCollisionGroupと同じ番号になり、上部プレートでヒットを検出しなくなります。
[Image Removed]
■CreateAsyncRayTraceGpuの使い方(組み込み方)
実物としては、FX_RayTraceのスクラッチパッドをご覧ください。
ポイントは以下となります。
・CreateとReadを同じモジュール/スクラッチパッドに組み込む(同じAsyncTraceGpuで操作を行う)
・Readは前フレームのクエリIDを必要とするので、Read→Create→クエリIDの保存、のように組むと制御しやすい
[Image Removed]
・クエリIDはパーティクルSpawn時に-1で初期化(Readは-1のクエリIDに対して何もしないので、Read先行のロジックでも安全です)
[Image Removed]
・Trace Provider には HW Ray Tracingを指定(これ以外のProviderは、CollisionGroupに対応しません)
[Image Removed]・衝突時、CollisionPosWorldの位置にその場でデバッグ表示を出すと検証しやすい
以上となります。
よろしくお願いいたします。
[Attachment Removed]
お世話になっております。
ご回答いただきありがとうございます。
用意していただいたアセットのおかげで正しい使用方法の確認が出来ました。
お手数をおかけして申し訳ありませんが、アセットを拝見した所パーティクル同士で判定を取っていると思わしき挙動を確認したので、こちらの対処法についてご相談させてください。
検証に使用させていただいたFX_RayTraceですが、遠くから見ると床とのみ判定を取っているのですが、近づくとパーティクル同士で判定を取っているように見える挙動になっていました。
確認した所、レイトレの空間内にあるメッシュが距離によってカリングされることが分かり、それに合わせてパーティクル同士の判定が変わる挙動になっているのではないかと考えています。
お忙しいところ恐縮ですが、こういった状況の場合パーティクル同士の判定を取らないようにする為にはどのような対処法が良いか、お聞きしてもよろしいでしょうか。
よろしくお願いいたします。 [Image Removed]
[Attachment Removed]
お世話になっております。
ご回答いただきありがとうございます。
ご提案いただきました回避策を参考に、最善の方法が取れないか検討してまいります。
ご多忙のところご対応いただき、ありがとうございました。
[Attachment Removed]
お世話になっております。
アセットのご確認ありがとうございました。
また、ご指摘誠にありがとうございます。
当方でも、Mesh Rendererを使用したNiagaraにおいて、接近することでこのメッシュがレイトレ界に入り、パーティクル同士のコリジョンをとってしまうことを確認いたしました。
Collisionモジュールでも同様の問題が発生するようです。大変失礼いたしました。
回避策ですが、
・Colliosion GroupはNiagara Componentから各パーティクルに伝播しないこと
・よしんば各メッシュパーティクルがCollision Groupを持ちえたとしても、パーティクル同士のコリジョンを無視して本当にコリジョンすべきものを探すために Retraces しなければならなくなる(=負荷が増す)こと
という2点の事情から、
仕様が許すのであれば、Mesh Rendererでご利用の Static Mesh アセットにおいて「Support Ray Tracing」を切っていただくことが、現在ご案内可能なアプローチとなります。
[Image Removed]
お渡ししたサンプルでいえば、Contentフォルダ直下にある SM_Cube の設定において Support Ray Tracing を OFF にする形です。
一度、ご確認いただけますと幸いです。
以上、よろしくお願いいたします。
[Attachment Removed]
ご確認ありがとうございます。
それでは、本件は回答済みとしてCloseさせていただきます。
以上、よろしくお願いします。
[Attachment Removed]