ラベル ThinkingParticles の投稿を表示しています。 すべての投稿を表示
ラベル ThinkingParticles の投稿を表示しています。 すべての投稿を表示

2014年7月5日土曜日

TPで建物の破壊に挑戦してみた。




Destruction FX - (ThinkingParticles + FumeFx) from notchmen on Vimeo.


これまで、TPのR&Dを様々やってきましたが、ようやくTPの真骨頂とも言うべき破壊FXに挑戦してみました。小規模な破壊FXは仕事でも少なからず経験し今回のは、カテゴリにすると中規模?くらいになるかと思っています。なかなか仕事では、こういったクラスの仕事が入ってこないので自主制作という形でトライしてみました。そして、米岡さんによる破壊エフェクトセミナー後でもありタイミング的にもよかったと思います。

後、ムービー中に色々情報記載していますが、いくつか追記したいと思います。
今回制作に関わった者は会社の後輩と自分の二人になります。後輩には、隕石周りをお願いしました。建物のモデルは、turbosquidから自腹で購入しました。自分で制作してもよかったのですが時間ないのと破壊のスキルのほうを上げるのがメインだったので購入にいたりました。それでも、そのままでは使い物にはならないので、簡単にレタッチ、そして破壊モデル用として修正しています。

破壊用のプリカットモデルの作成には、Advanced Fragment scriptを使用しました。
rayfireと比べるとこちらは、破壊用のプリカットモデルを作る際に必要な機能だけチョイスされたようなものだと思います。直感的に分割できるのでおすすめです。

次にTPシーンの解説と行きたいところですが、その力は残っていないです^^
てか、解説するほどの新しい手法はあまり使ってないですね。
一つ上げるならば、debrisをVBされた破片にも継承させる事ですかね。
基本は、破壊エフェクトセミナーでの手法を取り入れさせてもらっています。A,B,C,Dと四往復以上読みましたw
又最近、 TheHouseFXrman197 といったマスター達が破壊のシーンを配布しております。前者は有料ですが。これは、TPで破壊やるなら通るべきものだと思うので落ち着いたら勉強しようと思います。

最後になりますが、この経験を経て、一番重要な点を上げるとしたら、いかにトライ&エラーできるセッティングにするかですかね。
それぞれの環境にもよると思うのですが、キャッシュ用のマシンがないとキツイと思います。あったとしてもやはり無駄な計算をさせないようにセッティングしていくのは重要な点でしょう。
破壊の見た目とは直接関わらないことかもしれませんが、最終的なできは違ってくるので気をつけたいところです。

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 :)

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

ちゃんとした方向を設定するには軌道方向( direction of travel)では、情報が少ない。だからクロスベクトルを必要とする。クロスベクトルは任意の仮定したベクトルから作ってやる。
問題点として、クロスベクトルを得る際に、仮定した二つ目のベクトルが元の方向( direction of travel)と重なった場合にフリップは起こるという事だと解釈。
なので、重ならないようになるべくすることが必要。くるくる回転されたらいつか重なるのは回避できない。
こういうときはクオータニオン??ただ整列させるだけには使わないのかな。整列+回転がクオータニオンの出番といったところか。
---------------


あーこれジンバルロックという事かな?
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で代用するなどしています。ベロシティの状態も記しました。



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

2013年10月10日木曜日

TPのベロシティのデータについて

今更ながらおさらい。。

Velocityデータの中身をデバックで覗いてみると、

x=*** , y=*** , z=*** , speed=***  /-- 計算はこんな感じ→[unit(xyz) X speed = xyz]

とある。親切にspeedの値が見れる^^他のソフトも見れるのかな?

まあ、これを踏まえたうえで下の画像を確認してみる。

シンプルにノードつなげてテストしたのだけど、
現在のvelocityをvelocityノードにつなぐと、同じ結果かと思いきやに赤枠のspeed100が乗算されるぽい。
同じ結果にするには、値を1にするか、partiledata使うかだね。

これ結構、重要だと思ったのでメモした。
まあ、これだけの説明じゃ何が重要かわからないかもしれないな。

後、他のソフトでもvelocityの値って、speed別に分けられてんのかな。初めは、てっきりpoint3値だと思ってた。


2013年8月18日日曜日

TPのBulletPhysicsでRBDの巻


TP_Charactor Break by BulletPhysics #1 from notchmen on Vimeo.

BulletPhysicsオペレーターのERPを中心に調査しました。なぜなら、一番挙動が変わる重要な設定ぽいので。
まず、ERPって何だ?って事ですがヘルプ読んでも理解できませんでした。
なので、それぞれパターンを出して比べてみました。
みてみると数値が高いほど破片がぶっ飛ぶようですね。 低いほど破片がめり込むようです。
SplitImpulseをOnにすることで、高い値でふっとばないようにする事ができました。
SplitImpulseって何なのって事も理解できませんでしたので、試して判断です。
この辺ある程度でも理解できる方教えてほしいところです^^


キャラが壊れる参考設定→こちら

 

TPで破片がプルンプルン

破壊した後の破片の処理について、force(重力)が強いと地面に落ちた破片が、地味に動き続けたりプルンプルンしたりする。


bulletPhysicsのgroupPropertyに現在の速度や回転によってスリープ化する事ができるが、forceが毎度上乗せされる事が原因と見られる。
皆さんはどう対処していますか?
今回は、forceの影響のないグループにもっていき対処しました。

関係ないけど、blogger動画アップできるようになってる!!楽チンだ~^^

2013年7月6日土曜日

Iteratorで作成したPの位置情報をmemoryに入れて取り出したいのだが。。。

追記
>> igouさんより
メモリが記録したのposはそのP自身のものなので、前への方向を計算しようがないと思います。

なるほど。。

大きな勘違いをしてた。

p02の過去の位置探ったらp01の位置が取れると思ってた。
p02の過去の位置どれだけ探っても、自身が動いていない限り変化なしだよ。
この先入観により今日一日がつぶれました。ファックス!
久しぶりにTP触ったといえこの有様。自信なくすわ本当に。
とりあえず、この回答は別のやり方が必要になりそうなので次回にでも。

以下そのはずかしネタ
↓↓
----------------------------------------------------------------------------------

TPの入試に出てきそうな問題です。格下の。。

下記のようにIteratorで、パーティクルを配置する。シェイプはCylinderとしている。

このCylinderの方向を、自身のparticleID+1のポジションに向くようにしたい。


図で言うと、p01ならp02の方向を向く。
※図のcylinderはx軸に並んでおるが、どのポジションでも対応できるようにする。 


下記の設定で行くと思ったのに。。。上手く行かない。落第。


memoryのdepthにつながっている整数は1です。


 
ファイルです→https://dl.dropboxusercontent.com/u/85891935/Iterator%26Alignment_test.max

max2012,TP5

なぜだか説明できる方ご一報を^^

2013年5月5日日曜日

TPで電撃ビリビリに挑戦2


TP_LightningBeam_v001 from notchmen on Vimeo.


TP_ThunderObject test from notchmen on Vimeo.


TPで電撃ビリビリ系、大体ものにしたかな~。 とりあえず、この辺にしといて後は実践にしよう。
一つ一つ組み方、解説していきたいところだけど、 長くなりそうだし、粗でてきそうだしパス。
vimeoにもリンク張っていますが、igouさんのplasmaToolを参考にし自分なりにあれこれ組みました。
こちらにも→https://vimeo.com/65464758参考になるデータ上がってそうなのでリンク張っておきます。

▼久々のTPで、今回学んだことを順にメモ

1、Iteratorの使い方
 いつもIterator使うとき、ダイナミクスの中で完結していたが今回メモリでNumberを保存し別ダイナミクスで調整していった。これで、1つのダイナミクスをシンプルに組む事ができた。


2、パーティクルラインををベジェカーブで制御
 こちらは、ポイント数に合わせたベジェカーブ式を入れるだけ。→こちら









 二項係数はこちらより










5つのポイントの場合→(1-t)^4*V1 + 4*t*(1-t)^3*V2 + 6*t^2*(1-t)^2*V3 + 4*t^3*(1-t)*V4 + t^4*V5
とTPのエクスプレッションノードに入れる。
こんな感じに制御できる↓↓

















 現在LightningBeam_v001のベジェ ポイントはパーティクルで置いて制御しているのだが、現状プロシージャルでベジェ ポイントを減らしたり増やしたりできていない。
二項係数の関数があればと思ったが存在しないしつくれない。


3、maxのノイズコントローラーを使う

TPでは、noise系のノードがないため、稲妻のようなものは高度なエクスプレッションでの表現が必要と思っていたが、 ノイズコントローラーを使うことで表現できる。これは、思いつかなかった。
いや~igouさん感謝。おかげで、time to Valueノードの表現が膨らんだ。



2013年4月21日日曜日

TPで電撃ビリビリに挑戦



iGouさんが、すごい良い感じの電撃ビリビリ作っていたので,久々のTPを復習しつつ挑戦してみた。


やっぱ、むずいっす。。。
駄目だ、どうしよう。。iGouさんの記事を待つことにするか^^やり方全く違うと思うけど。
一応、どなたか突っ込んでくれることを期待しつつデータ添付!!


max2012 TP5
データはこちら

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にシェイプと向きを与える 。










終了~。

2012年10月27日土曜日

TPで回転周りを考察してみた~spin~

追記 2013/01/05
の記事は全体的にまとまっていません(汗)
ちゃんと理解できたら、追記&整理していきたいと思います。
それなのに記事にしてすみません++
詳しい方からのヘルプ待っています。


今回の記事は、AfterburnをTPで制御してる際に、TPの回転とABの回転を同期したいと思い色々調べました。

これまで、調べたのをメモ代わりに記述していきます。

結論から言うと、海外のフォーラムでのやり取りを参考に調べた限り、激ムズです。てか無理??
ですが、1軸の同期はできました!!
追記 メモ
Spinノードでxyz軸の数値を[1,0,0]などのように1軸を同期することはできる。[0.3,0.5,0.8]などのような各軸が混ざり合った値は駄目。
ABでは、ワールド空間軸からxyzの回転値を取得し回転するのに対して、TPでは軸を任意のに設定し、その軸を元にxyz回転させる模様。。


激ムズ部分について確かなことは言えないのですが、TPのSpinノードによる回転はクオータニオンでクルクル回転していて、ABの回転はオイラーでクルクル回転してるようです。ですので、これらを合わせる必要があると思われます。
まず、オイラーとクオータニオンをなんとなく知ってるようじゃ先に進めません。
ですが、クオータニオンからオイラーの変換とか調べてみると撃沈。

こちらで軽く基礎をつかめましたが、まだまだです。
難しいので、一先ずオイラーとクオータニオンは置いておきます。


まず、TPからABに回転を同期しました。動画をご覧ください。


回転は、TPのSpinノードを使用しX軸を基準に回転させています。
構成を三つに分けてみました。
①大きい矢印が、TPによるパーティクルシェイプです。
②小さい矢印は、TPによる回転と位置の値をParamBlockで矢印モデルのコントローラーのオイラー回転とポジションXYZに割り当てたものです。
③球はABによるものです。
全てばっちり同期してます。
ノードの構成は、下記に添付。


次に、TPのSpinノードで基準軸をランダムにしてみました。
ランダムに回転する方法ってこれですよね??


残念、①が同期していません。
これが、クオータニオンによるがかかわってきてるのかな~と思いました。
つまり、①はクオータニオンで回転してて、②、③はオイラーで回転しているので
これら二つを一致させて回転しないと同期しないということです。



そこで、②の矢印モデルの回転コントローラーをクオータニオンにしてみました。
クオータニオンは方位を表すものなので①のAlignmentを②のクオータニオン値にParamBlockでつなげました。



①と②が同期しました。やはり①はクオータニオンによる回転です。
ってかそれは、常識なのかな。パーティクルの回転はクオータニオンが基本みたいな。
どなたかご教授ください^^


さて、ABと回転が同期できるまで、もう一歩。
なのだが、ABの回転コントローラーをクオータニオンに変化させるなんてことはム~リ~。。
それか、TPのパーティクルの回転をオイラーにするかのどちらかです。なおさらム~リ~。。

ということで、目的は果たせませんでした!!

CG数学の道は、遠すぎる。。


フォーラムで3akさんから教えてもらったSpinのアウトプットデータストリームが特に役に立ったので要チェック!!







こういう難しい問題を、少しでも英語でやりとりできたのは良かった。
英語もがんばるぜ!!

>>benra
Hi Notchmen. I'm very new to TP, but i am familiar with vector math. If my memory serves me well. the Get direction helper should give you the current x y and z vectors of your particle. these are expressed as unit vectors . The dot product of each of these and world x , y ,z vectors will give you the cosine of the angle between each of them. - this angle i think will be your current rotation of each axis away from each world zero unit vectors. To be more clear - dot product between vectors A and B . = A.B = |A| |B| cos theta .
where
theta = the rotation angle.
|A| = magnitude of A = always 1 for unit vectors.

The Particle data helper also has access to the alignment of your particle - but im still too fresh to TP to know how to access that in terms of rotations.



>>3ak
IMO you don't need math to get rotation - wire spin data to vector and you'll get axis of rotation. Wire spin data to scalar and you'll get angular speed in radians per second.

i just don't remember what kind of data suits afterburn. You can export through 2 channels - vector and float or convert to quaternion (but there is no quat data channel in tp).