Solver SOPを使って簡単なPOPソルバーを作ってみる


どうも篠島です。前回は運動方程式を説明しましたが、それを元に簡単にSolver SOPを使ってPOPソルバーが作れてしまいます。Solverノードを使って実際に超簡単なソルバーを作ってみる でSolver SOP使いましたが、これは加速度を -9.8 とした運動方程式です。

 

今回のサンプルファイルです。
equation_of_motion.zip

 

今回は下のようなネットワークで手作りPOPソルバーと既存のPOPソルバーの動きが同じになる事を確認します。

5

 

前回の運動方程式を元に自分でPOPソルバーを作ると下の様なVEXコードを書く事になります。たったの数行で簡単なPOPソルバーができてしまいました。コリジョンなどは起きませんが、ポイントを動かす原理が分かるかと思います。フォースは{2,0,0}で固定していますが、パラメーターで値を自由に変更することも可能です。
@Timeincはフレームレートの変数です。環境によって24だったり30だったりします。サンプルファイルでは@Timeincの挙動がおかしかったので24とコンスタントな値を入れています。

1

これをVOPで作ると下の様になります。ごちゃごちゃしててパッと見ただけでは何をしているのか非常に分かりにくいですね。大抵の場合VOPノードを繋げるよりもVEXコードでぱぱっと書いてしまったほうが早いし、何をしているのかも分かりやすいです。

3

そしたらポイントが下のようにシミュレーションされます。ポイント毎に異なるMassを設定しているので、Massが大きいポイントほどフォースの影響を受けにくくなります。

a

 

サンプルファイルの中に同じ設定のPOPネットワークもあるので参考にしてください。手作りのPOPソルバーと既存のPOPソルバーが同じように動いています。POPネットワークでフォースを追加するとデフォルトでIgnore MassがONになっています。これは全てのフォースが全てのオブジェクトに同様に影響を与えます。今回は運動方程式のサンプルなので、Ignore MassはOFFにしています。

2

 

これでフォース、加速度、速度がどのようにして位置に影響を与えるかが分かったと思います。POPネットワークで既存のフォースを使う場合は何も意識する必要は無いのですが、カスタムフォースを自分で作りたい時はPOP VOPやPOP Wrangleで自分でフォースを作る必要があります。

昔のPOP Network -Old ではPOP VOPを使う時に加速度などを出力するアウトプットがありましたが、新しいPOP VOPではフォースの出力になっています。なのでカスタムフォースを適用したい場合、昔のPOPネットワークだとMassで割ってから加速度に繋ぐ必要がありますが、新しいPOPネットワークはフォースにそのまま繋ぐだけです。あとはPOPソルバーが勝手にVelocityとPositionを計算してくれます。

4

 

ちなみに、手作りPOPソルバーで複数のフォースを使いたい場合は、純粋に全てのフォースを足してから加速度に追加すればOKです。

7