2012年12月29日土曜日

「TPで障害物を避ける」シリーズpart3(最終回)


今回は、障害物に奥行きを与え、Objパーティクルが障害物を避けるためのターゲットポイントの位置を調整しました。

ターゲットポイントの位置はClosest Point等のちょっとした数学、算数を使いながら求めていきます。Closest Pointについては、以前の記事で触れました。

こういった内容で進めていきますが、ノードの組み方を説明していくと時間がかかってしょうがないので考え方だけを記事にしていけたらと思います。

はじめに、完成動画をご覧ください。


完璧です。と言いたい所なのですが、障害物が複雑に複数配置されていると破綻してしまいますorz
今回はそうならないように、障害物を配置していますw


下図が今回調整した大まかな点になります。

















前回から障害物を変更し浮き上がった問題を調整するといった感じです。


では、どのようにターゲットポイントの位置を調整していくかを簡単に図にしました。
アプローチは、色々あると思われますがチュートリアル通りに行いました。











このような感じでターゲットポイントを設定しています。

③の式は自身手こずったので取り上げます。
式だけ見ると算数なんですよね。これ見てパッと理解できず算数力のなさにへこみました。
基礎筋トレしていかないと、筋力が全く足りないです。












最後に、今回はノードの構成というより何をやっているのかに焦点を当てていきました。
こういう何をやっているのかがある程度わかるとすんなり進むと思います。

これでようやく、Joe Scarr氏のDVDSquirlArt CROWD SETUPSをほぼ終えました。
最初このチュートリアルに入ったとき、ノードの構成&エクスプレッションをみて絶望的でしたが、時間かけて少しづつ進めるうちに理解できるようになりました。そして、多くを学ぶことができました。
これまでを見るとわかるとおり数学が多く使われています。
ツールはどんどん新しく変化していきますが数学は変わりません。
と、どこかの本に書いてありましたw
なのでこのチュートリアルは数学を学べるという意味で強く、おススメしますw 

もう一つの感想として、このシステムを完璧にしようとすると、キリがないですw
これは、どのシステムにもいえることかもしれませんね。
自身が大きなシステムとかプログラムとか組んだことないからわからないですが見極めも肝心だと思いました。やっていると、どんどんアイデアが浮かぶものです^^あーしたい、こーしたいと。

このチュートリアルでも完璧なシステムに達していないと思います。実際、障害物の配置によって破綻してます。

そこで、SquirlArt CROWD SETUPS最後のflowField 2Dの項目があります。
これはスプラインでパーティクルを誘導するといったアーティストよりな方法をとっています。

なので、全てをプロシージャルにするのは気持ちよいのと思いますが、見極めが肝心ということも勉強になりました。




 

2012年12月11日火曜日

TPで2直線の交点を求める

前回に続き、数学ネタです。
前々から紹介している、こちらをTPでやってみるって感じで進めます。
もう、リンク先見たほうが早いと思いますが。。


図①




















はじめに、線分AB上の点を求める式です。
前回の式と同じです。


TP式①-- Apos+(unit(AB)*length(AP))

今回もベクトルAPを求めていきます。
図①を見るとわかるように、ベクトルAPは、点Aから直線CDの最短距離ではありません。
前回は外積で最短距離求めていきました。
今回も、前回とちょっと使い方は異なりますが、外積を使い求めていきます。

図②


















ざざっと図にしてみた。
直線CDに対し、直線ACとABの外積を求めると青線、赤線が求まる。
この青線と赤線、二つの比率がベクトルAPの大きさとなる。
つまりTP式①のlength(AP)となる。






























いつものように後半、内容スカスカ!?
いつか自分で記事見直したときに調整します。
さらば。サササ、、、--

2012年12月8日土曜日

TPで、任意の座標からもっとも近い線分上の点を求める

ちょっとタイトルが長くなってしまいました(汗)数学での良い言い回しとかありそうですが。。。
英語では、Closest Pointと言うのですかね?
ここで、躓いてたらいかんので画像でどういった事か説明します。

図①



















といった感じです。
点A,B,Cのベクトル値は確定してるものとして進めていきます。
今回は点Pを求めるにあたって、外積を使い求めていきます。
内積でも、求められますが 外積で求めていきたいと思います。
理由は、外積だと上で求めたものをちょっと応用すれば直線同士の交差点も求められます。
こんな感じです。 すばらしい!
内積だと、これは無理かな~と。すみません、憶測です^^

では、早速やっていきます。※関数とかTP用の表現を使っています。


はじめに、線分AB上の点を求める式です。こちらにも書きましたが復習です。

図②



















TP式①-- Apos+(unit(AB)*length(AP))

ベクトルAとABは、わかっていますので、ベクトルAPの大きさがわかれば、ベクトルPが求まります。



では、ベクトルAPの大きさを求めていきます。
わかりやすいように、辺d,e,fを割り当ててみました。
ベクトルAPの大きさがfということですね。

図③




















ピタゴラスの定理から、fを求めるにはeとdが解ければ求まりますね。


TP式②-- f = sqrt(d*d-e*e)


これで、ベクトルAPの大きさは求まります。
後はeとdを埋めていくだけです。

dの方はベクトルACの大きさを求めればよいので、求まります。
さてeですが、ここで外積を使います。

TP式③-- e = length(AB x AC)/length(AB)
※TP式③のベクトルABの大きさは、1でもなんでも揃っていれば良いらしい。

式の参考

こちら2Dでのある点から直線までの距離より

全ての値の準備ができたので、TPに組み込んでいきます。
上記の三つのTP式を組み込みました。
































さてさて、これの使いどころはいつになるのやら。。
近々公開かな。



















2012年12月7日金曜日

「TPで障害物を避ける」シリーズpart2

前回の記事をpart1として、その続きになります。
といっても、自分のミスの修正です。
こそっと直したいところですが記憶に残しておきたかったので記事にしました。

前回は、障害物が一つだけでした。
まず、前回の設定のまま、障害物を増やしてみました。

動画①



いっこうにGoalに向かってくれないようです。。行き場を失っています^^
修正が必要です。

動画②

結果、なんとかGoalに向かわせることができました。

では、前回の設定を見つつ修正点をメモしていきたいと思います。


まず、動画①の問題点として、
Objパーティクル(三角錐モデル)が最初の障害物を避けた後、Goalに向かってくれないという点です。


前回の記事の④-3でObjパーティクルが最初の障害物を避けた後、ゴールに向かう条件が設定されています。GoalToCheckというダイナミクスです。簡単に言うと、Objパーティクルがゴールを視認することができたらGoalに向かうという条件設定になっています。
動画①では、追加した障害物のせいでObjパーティクルはGoalを視認できない事がわかるかと思います。まさに行き先を見失っているという感じですねw
なので、この条件設定は使えません。

次の条件に変更しました。







Guide for Avoidダイナミクスで取得したターゲットポイントに近づくと、再びゴールを目指すという条件設定です。

これで、万事解決というわけにはいきませんでした。
てか、全然駄目です。

んっと、現状、次に新たに発射されるObjパーティクルからターゲットポイントが作られると、最初のObjパーティクルはそのターゲットポイントが一番近いと判断したらそちらに向かってしまうということになっています。

図にしてみた↓↓














どういう設定かというと、
前回の記事の④-2にあるNearest point searchダイナミクスの設定になります。
このダイナミクスセットでは、毎回全てのターゲットポイントを取得して(PPassAB)、一番近いターゲットポイントを取得するように設定されています。
これでは、上図の右のような結果になるので、PPassABによるターゲットポイントの取得は無理なようです。


なので、PPassABは消して以下のように設定しました。






















こうすることで、Objパーティクルはターゲットポイント(ExitPos)を取得したときだけの位置又は方向を毎回取得することができます。ここのデータの流れの詳細な説明は省きます。
簡単に説明すると、図の上のダイナミクスセットはターゲットポイントを取得するためのダイナミクスセットで、下がその取得したターゲットポイントに向かう設定です。


大まかですが、これらのような修正をすることで動画②のような事ができるようになりました。
興味があれば、ファイルアップしますので設定を見比べてみてください^^
又、これらはあくまでも、俺流設定なので間違った点はあるかと思われます。
そして、そういった点や別の良い方法などあれば指摘してくれると助かります。
後、基本的な考え方はJoe Scarr氏のDVDを参考にしています。SquirlArt CROWD SETUPSの項目です。てか、修正するにつれ、その設定に近づいているかも^^

part1
part2

次回は、Objパーティクルが避けるためのターゲットポイントの位置を見直していきたいと思います。
こっからが、めっちゃ難しくなるところだと思います。
数学好きにはたまらない内容になるかもです^^



2012年12月1日土曜日

「TPで障害物を避ける」を一旦まとめてみた。

ちょいちょい忙しくて、久々更新です。

以前にも、障害物を避ける件については、チョコチョコ記事にしていたのですが、キリいいところまで来たので一旦まとめようと思います。

まず、基本的な考え方はJoe Scarr氏のDVDを参考にしています。SquirlArt CROWD SETUPS項目ですね。ご覧になった方は、わかると思うのですが、非常に複雑かつエクスプレッションが頻繁に使われ難しいです。

ですが時間をかけて、チュートリアルを進めるうちに、ある程度つかめてきました。
そして、0から自分でセットアップしてみました。 
結果は、本家と比べ、大分オレオレ設定になってしまいました^^
注意点として、今回上記のチュートリアルの項目全てを取り入れたわけではありませんが大枠は捉えることができたのかなと思っています。
残りは次回にでも記事にできたらなと思います。

では、一つ一つメモする感じで説明していきたいと思います。

はじめに動画をご覧ください↓↓



では、順々にやっていきます。

このシステムの設計書を適当に文字や図で紙に書く。

みなさん、実際やっていますか?^^
あまり大きなシステム作ったことないのであれですが、自分は苦手です。
実際手で動かさないとわからないこともあるし。。
とりあえず、形的にやってみましたって感じです。

①を元にとりあえず必要なデータ、グループをつくってみた。

プログラマっぽく、グローバルデータをメモリノードに入れてみたw
グループは、はじめから画像のように整理されていたわけではない。後から、このように整理した。










StartPointからGoalPointまで、パーティクルを移動する。



大きくは↓↓の記事を元に動かしています。
----こちら-----


設定画像↓



















ちなみに、水色枠の角度を求める方法かなり使えますので抑えておいたほうが吉!

障害物を避ける

ここからが、個人的には面白いかなと思います。
やっている事としましては、ある条件を元にサンプルとなるパーティクルを発生させて、それに向かってObjは進行方向を変えるというようなことを行っています。
ちょっと、複雑になりそうなので、さらに見出しを分解してみて行きたいと思います。

1、障害物をサーチします

ある距離になると、障害物をサーチする設定です。サーチした情報はメモリに保存しておきます。










2、障害物を避けるための方向を取得するためにTargetPointを作成します。

1で、サーチした情報を元にTargetPointを作成します。
このTargetPointの作成方法は、こちらを元にしています。
リンクの設定では、同心円状にパーティクル(TargetPoint)を配置しています。
今回は、横一列にパーティクル(TargetPoint)を配置しています。
この違いは、前者が左右、上下に障害物を避けれるように設定できるのに対して、 後者は左右だけです。今回は左右だけでとりあえず進めました。



 











注意点!!TargetPointを取得できたら、ObjはグループをObj GoToGoalからObj Avoid Obstractに変更しています。理由は、進むべきターゲットが変更したのでデータを扱いやすくするためです。後に説明しますが、避けるのを達成できたら、もう一度Obj GoToGoalグループに戻るように設定しています。

3、Objの向きを、2のTargetPointに置き換えます。つまり、障害物を避ける設定です。そして、避けたらGoalへと再び向かいます。

















肝となるのが上記の画像に記しているように、再びGoalに向かわせる条件をどうするのかということです。

障害物をサーチした情報をリセットする。

 





④-1で、Obj GoToGoalグループがbool(on)になったままですので、リセットします。
これをリセットしないと、 ④-3で避けて再び戻ったObj GoToGoalはbool(on)になったままですので、毎フレGuideパーティクルが作られます。

Objにシェイプと向きを与える 。










終了~。