2013年11月16日土曜日

TPでboidsをセットアップしてみる。その7 シェイプの向き解決?

さて、色々調べ物して更新までに時間がかかった。
前回、シェイプのある軸がフリップする現象に悩まされた。
色々探ったが、もうわからんのでCGTalkで質問したら、Hrist氏より「Just don't use the Z axis」とコメント頂いた。
--------------------
2013/11/18更新
Hrist
It's complicated, and I don't really understand 3D rotations completely, but let's try. When you define a rotation by one vector, say, the direction of travel, that's not actually enough information to align the particle. So it just assumes one more direction (up), and then gets the third by vector cross product of the two. And it might flip because at some point in rotating it the 'up' gets wrong because of the assumed second vector :)

っていうコメント追加でいただいたけど、、?
ん~フリップする原因はあるポイントで不正なベクトルを得ることによるため??なんか回避はできなそうだな。。外積での三つ目のベクトル計算のときに、二つ目のベクトルがフリップするからなんだろうけど、原因がわからん。
---------------


あーこれジンバルロックという事かな?
Alignmentの軸をx axisにすると思い通りの結果になった。






画質悪くてわかりづらいと思うが、意図した方向にお魚が向いている。
しかし、ゴールなしでこんな風にboidを放てばどっかでジンバルロックが起きるはず。。。
その解決法はクオータニオン??
謎は深まるばかりorz

とりあえず、一旦締めということでムービーでも作ろうかな。
でもboidは、色々勉強になるので、まだまだ探って行きたいと思います。

2013年10月26日土曜日

TPでboidsをセットアップしてみる。その6 シェイプの向き

う~最後の最後で、手詰まり。。。
解決はできていないが、問題をメモしたいと思う。
なんに手詰っているかというと、魚のシェイプの向きの設定だ。。
以前のAlignmentの記事では進む方向には向いているものの、体の上面、下面が揃っていない。

こんな感じ↓↓
青の方向が進む方向で、赤の矢印が上面下面だ。赤の矢印が上向いたり下向いたり安定しない。

次に試しに、赤の矢印が下向かないようにエクスプレッションで赤の矢印の-値を+値にするよう調整したが、今度は青の矢印が上手くいかなくなった。なんかぴくぴくしてるし。。
という具合で、あれこれ試しながら手詰まっている。
回転周り、ほんと苦手。。。
ちょっと、数学周り勉強しないと駄目なようだ。。

時間かかりそうだな~。。

2013年10月16日水曜日

TPでboidsをセットアップしてみる。その5 AvoidObstacles

いよいよ、終わりに近づいてきた。目標として、セットアップは次で終わりにしたい。
今回は、Separation(引き離し)の障害物版だ。前のSeparationでは、boids同士の引き離しのみをやった。
又、パーティクルが障害物を避ける記事は、前に記事に取り上げている。
前の記事と基礎的なフローは一緒と考えてよいかな。今回のと比べたいところだが長くなるのでやめとく。いえるのは、どっちも勉強になるということ。障害物は、引き出し多いほうが対処できるしね。

障害物追加設定した動画↓




なかなか、いい感じにできた。オリジナルのルールで障害物に近づくと、スピード落とすのも上手く機能している。


ではまず、障害物に対し、ある距離近づくとintersectで自身の進む方向にrayを飛ばし、rayが障害物にhitしたときに、メモリに必要データを保存している。
ここでは、メモリの使い方に注目してほしい。memoryのhitをONにしたりOFFにしたりしている。
画像の説明でわかるとよいが、、。。
勉強になるな~この辺はのメモリの使い方に関しては、ナイスガイのデータを参考にした。
前の記事ではObstclesはノードヘルパーで、やったのでこのようなことは必要なかった。障害物をPshapeにしたいときはPPassでこう組めばよいかな^^


次に、AvoidTargetを作成する。
これは、この方向へ避けますよというガイド的なもので、次ダイナミクスでベロシティにaddするために必要なデータをメモリに入れる。詳細はこちらの④と大体同じなので伏せて確認すると良い。

最後に、velocityの設定を行う。
ナイスガイは、上記の条件で方向を置き換えする設定にしていた。これだと、条件満たすと急に方向が変わるのでピクッとした動きになるかと思う。 これを、いつものvelocityにaddでできるだけ滑らかに表現したいと思った。
と、、記事を書きながら思ったんだけど、その方向を変えるベクトルを小さく(上記画像の半径にあたる)して、徐々に毎サンプルすることで急に方向が変わることは免れるのか!
まあ、でもvelocityにaddという方法を取り入れたことで、解かりやすいし色々スピード調整も可能だ。上記のオリジナルルールも取り入れる事ができた。
結局、addでなくて方向を置き換えることにした。動画は結果あまり変わらないので更新しない。
更新前

更新後



記事書きながら途中で気づいた点もあったりして、消化不良な感じになったがこれまで。
たぶん、最後のvelosityの設定は調整するかも。そのときは更新する。

以上。。





2013年10月15日火曜日

TPでboidsをセットアップしてみる。その4 Alignment

今回は、Alignment(整列)についてだ。
前回は、目に見えたboidsの合計平均位置を求めて、そこに飛ぶようにした。
Alignment(整列)も同じ感じで、目に見えたboidsの合計平均ベロシティを求めて周りとスピードを合わせるというものだ。後、boidsの向きを周りと合わせる。
さらに、boidsの最高速度を設定してスピードの制限をした。
この3つについて、みていきたい。

まず、それらを設定した動画↓↓




その2から比べると、周りのboidsにCohesion、Alignmentを設定したため、それらしくなっている。
又、お魚さんのシェイプも適当に割り当ててみた^^

始めに、前回と同じようにSumVelocityとpcountのメモリを用意する。

これは次の、SumVelCalcダイナミクスでもそうだが、 目に見える条件は一緒なのでCohesionとまとめるほうがデータ的には軽くなると思う。とりあえず、解かりやすさを優先して最終的に整理するようにしたい。
上記でいったように、SumPosisionとダイナミクスを分けている。条件は全く一緒で、ベロシティのaddしていく感じも大体一緒だ。


 ここで、平均ベロシティをaddしていく。vif関数でp-countを条件化して平均ベロシティを計算する。


boidsが進む方向に向きを設定。
次に、boidsの最高速度を設定する。これは結構使うと思うので、要チェックしておきたい。
MaxSpeedより、現在のスピードが速かったら、現在の方向にMaxSpeedを乗算する。それ以外は、現在のスピードという感じ。
シェイプダイナミクスの説明は、省く。


以上。

2013年10月14日月曜日

TPでboidsをセットアップしてみる。その3 Cohesion

今回は、個々が独りぼっちにならないように結合(Cohesion)の設定を行う。
これまでの、boidの個々はgoalに向かうよう設定されているため、はぐれる事はない。
だがgoalがないときやgoalを見失ったときどこに進めばよいか?
そんなときのために、自身の視界(目の悪さも含む即ち距離)に入るboids達の方向に進む設定を行いたいと思う。
さらに誰も視界に入らなかったときの設定は、次回にしたい。

まず、Cohesionの設定の有無を動画にしてみた↓
解かりやすくするため、ゴールの追従はなしにしている。


結果、いい感じだけど、メマトイのような感じになって気持ち悪くなった^^

今回は、ちょっと難しかった。
特に、どのように視界に入ったboidから合計平均した位置を取得するかに悩んだ。
ちっらっと、ナイスガイのデータをのぞき見た^^
ふむふむ、メモリを二つ使って再帰的にやっているね。


では、一旦それは置いといて、必要なデータをメモリに用意する。
用意と同時に、次サンプリング時に初期化されるようになっている。
次サンプリング時には、視界に入ったboidの合計位置は変化するから必ず必要である。p-countも0ね。


次に、ppassでall取得して、その個々を結ぶベクトルとベロシティの角度が○○度ならば、という条件で視界の入るboidの数とその合計位置を生成する。
メモリの使い方がナイス過ぎる。こういうの、なかなか考え付かないんだよな~。。勉強になる。
あと、角度計算するときのベクトルの向き重要!ここでいう、subtractionにinputするベクトル。


最後に、上記の合計平均位置へのベロシティを調整する。
ここの、ダイナミクスはこれまでやってきたように、boidのvelocityにSumPosへのvelocityをaddしていく。

 以上。

2013年10月13日日曜日

TPでboidsをセットアップしてみる。その2 Separation

次に、boid同士の引き離しをやってみる。
リンクでは障害物の引き離しも含めているが、今回はBoid同士のみとする。
別の回で障害物の引き離しは行いたいと思う。

では、まず実験動画から。




前回のgoalと、このルールのたった二つの手順だけで案外らしく見れる^^

しかも、今回のダイナミクスの設定はこれだけ↓






ん、、あまり書く事がないか。。
基本の流れは、前回と一緒だしね。ベクトル反転するためにpoint3乗算してるくらいかな~。
ppassの使い方は、別のどっかの記事で書いたような見たような。。twitterでつぶやいたような。。
ということで、省きます。

では、また次回。

2013年10月11日金曜日

TPでboidsをセットアップしてみる。その1 toGoal

はじめに、
Boidsシステムは、以前から我が手でセットアップに挑戦しようと意気込んでいた。
そろそろ行くかと思ったとき、色々動画探っているとBoidsのTPファイルをアップしてくれてナイスガイを発見!うれしい反面、答案渡されたことで悲しい気持ちにもなった。
が、すぐさま答案を確認する。うわ~、上出来すぎる。なるほど、なるほど。
完璧に、理解はしていないが一通り確認した。

さて、、、、やるか。。。
まず、boidsに関して参考にしたのは、 上記のナイスガイとこちらのルールです 。
ルールやダイナミクスごとに、記事を何回かに分けて更新していけたらなと思っています。

全体的に内容は、中級以上かな?ボーダーラインわかんないけど^^
初級のことまで、つっこまないと思うので、ご覧になられるかたすみません。
重要だと思うところは、つっこみます!

ちなみに、自分でなるべく回答見ないで0から組み立ててますので、間違いやこうしたら良いあれば突っ込んでください^^


では、始めます。

まずは、Goalの設定です。これは、以前記事で取り上げた思います。
あるターゲットに向かってパーティクルを追従させます。



・boidsパーティクルを生成するダイナミクスです。

・goal(point)へ追従する設定です。
 boidsからpointへのvectorをdistanceで取得して、boidsのvelocityにaddしてます。
 ここで、重要なのがboidsからpointへのvelocityの値です。distanceを分子において、分母で大きさ調整しています。距離が大きいほど、ゴールに向かう力は大きくなります。ちょっと動画ではわかりづらいかもです。
//追記131013
上の図を少しシンプルにしたものです。Mathノードで固めた感じです。distanceノードをdivisionで代用するなどしています。ベロシティの状態も記しました。



とりあえず、まだまだ完成には遠い動きですがコツコツ進めていきたいと思います。
雑すぎる説明は、後々見返して修正できたらします。