UE4のBPだけでGPUパーティクルを実現しようとしているのですが、
各パーティクルを回転させると法線の計算がうまくいかないようです。
UE4でのGPGPUの記事についてはこちらで連載中です。
現象についての動画はこちら
MaterialBP内でPositionを動かしてなければ法線の計算はうまくいっているみたいだけど動かすとおかしい・・ #UE4 #GPGPU pic.twitter.com/KI75WJTs8b
— selflash (@anonymous_user_57739343) 2017年8月1日
原因を調べる為に、シンプルな構成で現象を再現いたします。
(1) Instanced Static Meshコンポーネントを追加して、マテリアルを設定します。
(2) キューブのインスタンスを2つ複製して、左右に配置します。
(3) RotateAboutAxisノードを使って2つのキューブを回します。回転速度に差をつけます。
左のキューブと右のキューブを判断する為に、WorldPositionのY座標が0以下なのか、0以上なのかで
どちらの回転の計算を適応するか振り分ける。
加えて法線にも回転の計算をする。
(4) Used Witdh Instanced Static Meshesにはチェックを入れておく。
結果がこんな感じです。右側のキューブは回転だけでなく左右に座標が移動します。
問題は、右のキューブが左右に座標移動している時に、Y座標が0以下に差し掛かった際に法線の計算が左のキューブの計算が適応されてしまう為、おかしくなってしまいます。
これについて僕の見解は、
マテリアルBP内ではNormalの出力ピンに繋がっているノード群よりWorldPositionOffsetに繋げているノード群の方先に処理される。
その後Normalの出力ピンに繋がっているノード群が処理されるが、その中でWorldPosition(絶対ワールド位置)を参照した時のWorldPosition(絶対ワールド位置)の値はWorldPositionOffsetが反映された後のPositionである。
それであるとこの挙動が納得できます。
ご相談は、これに関しての何か解決策や、良いアイデアはないでしょうか??
Normal出力ピンにつなげているノード群の中でWorldPositionOffsetが反映される前のWorldPosition(絶対ワールド位置)の値を得る方法はありませんか?
この法線問題のせいでもう少しで完成しようとしていたGPUパーティクルの手法が確立できず困ってます、、
なにとぞよろしくお願いいたします!