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月27日土曜日

houdiniをお触りしてみた。

これまで3dsmax一筋としてやってきたが、とうとう別の3Dソフトを触ってみた。
ほんのお触り程度ですが、大きな一歩になるかもしれぬw
まあHoudiniは、すぐ仕事で使うわけでもないし、一生使うかどうかもわからないのでボチボチ進めていけたらと思います。

まず、何でいまさらHoudini触ったかってとHoudini Engineの動画見てですかね。これ決め手です。
これは、が日本語訳してくれています。これなかったら概要つかめなかった。危ない。
それがこれ→HoudiniEngine
いや~これ見て感じたのは、HoudiniがCGソフト支配しそうな気がしました^^

また、他の理由としては、日本語マニュアルが出たことやユーザー増えてるところやNoPluginやら水やりたいやら色々あります。それらが積もり積もってって感じってのはありますw


んで、何から触り始めたらよいか悩んだ結果、HoudiniEngineの動画の一部のテキストぶっ壊して、アセット化する流れをやってみました。












プロシージャル強力すぎる!テキストの文字変更も押し出しも後から自由自在に変更可能!
しかも、このアセットが mayaやゲームエンジンで使えるとはすごい!
TPと似たところあるんですが、TPは全てプロシージャルで組めないですしね。
けど、このRBDだけでもTPのが速い気はします。こういう違いを見つけるのも勉強になります。


さあ~下半期でHoudiniどこまで覚えれるか。
TPのフルイドすごかったらそっち勉強するかもw
まあ柔軟に対応していきたいですな。









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
データはこちら

2013年4月14日日曜日

AEエクスプレッションメモ


▼渦巻きながら上昇
h=thisComp.height/2;
w=thisComp.width/2;
b=50; //浮力初期値
r=time*100; //渦の半径
x=Math.cos(time*360)*r+h;
y=Math.sin(time*360)*r+w;
z=time*b;
[x,y,z]