紙吹雪(confetti)popの質問

   433   2   0
User Avatar
Member
2 posts
Joined: 8月 2022
オフライン
初心者です、紙吹雪をテストで製作していました
地面に接した時に地面のノーマル方向に角度を変える(突き刺さらないようにする)挙動をやってみたかったんですが

// (前段の変数定義は同じ)
float duration = 1.0 / 8.0; 
float fps = 1.0 / @TimeInc; 
float amount_per_frame = 1.0 / (duration * fps);
float amount = 0.1;
// --- 処理の実行 ---

if (i@hitnum == 1) {
    // 保存しておいた法線ベクトルから、目標の向きを生成
    vector4 target_orient = quaternion(v@hitnml);

    // 現在の向きから目標の向きへ滑らかに補間
    @orient = slerp(@orient, target_orient, amount_per_frame);

    // 回転を停止
    @w = {0, 0, 0};
}

上記popwrangleをpostsolverに繋ぐと最初からY軸方向を向き続けます
geometry Spread sheetを見てもhitnumの挙動は正しいように見えるんですが、全フレームでif文が発火してしまっているように見えます
根本的な所で勘違いをしていると思いフォーラムに投げさせて頂きました

お手数おかけしますが、ご助言いただけると幸いです

Attachments:
confetti_help_mk.hiplc (331.0 KB)

User Avatar
スタッフ
5 posts
Joined: 3月 2025
オフライン
パーティクルに@orientアトリビュートがないのが原因だと思います。
そのコードの挙動だと、@hitnumが1以外の場合の@orientは初期値がないので{0,0,0,1}のようなデフォルトの回転しない値が入ってしまって
Y軸方向の向きのままとなっていると思います。
パーティクルには@vアトリビュートがあるわけなので、
@orient=quaternion(@v);
のように初期値を入れてはいかがでしょうか?この場合、Velocityを軸にそのVelocityの大きさで回転させた向きが設定されます。
User Avatar
Member
2 posts
Joined: 8月 2022
オフライン
初歩の初歩で勘違いしていました……!
ありがとうございます、修正できました!
  • Quick Links