日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年5月31日日曜日

linstep (2)

オンラインヘルプを読んでいるときopacityPPにlinstepを使用した例をみつけた。

「linstep」については以前のエントリ「linstep (1)」でとりあげ、「ゴールに近づいたパーティクルの色を変える (2)」でパーティクルに対して使うことを試みたことがある。

今回は使用例のバリエーションとしてこのオンラインヘルプの例をもう少し掘り下げてみたい。


----------------------------------------
これがオンラインヘルプの例:
particleShape1.opacityPP = linstep(0,5,particleShape1.age);


age」は前回「パーティクルの時間に関する事柄」で見たように、パーティクルの年齢を秒数で示している。



ここでなぜ「age」を使うのかを考えてみる。

まずlinstepから見なおしてみる。
linstep」は第一引数~第二引数の範囲外においては0か1の値しか返してこない。
従ってこの例では第三引数は「0」~「5」の間にあるときしか「opacityPP」に変化が現れない。

これがフレームの値を返す「frame」であると、フレーム5においてすでに限界値に達してしまう。
これは肉眼では一瞬であり、linstepを使う意味があまり無い


しかし、24fpsの場合フレーム5では「0.2085秒」であり、まだまだ余裕がある。

実際に最大値5に達するには、
5÷0.0417=119.904・・・
と約120フレームが必要となる。これは時間にすると当然ながら5秒となる。


linstepでの第二引数は、opacityPPが「1」に達するまでの時間を決めることがわかる。



なら同じ秒数の返り値を持つ「time」を使ってみてはどうか?
timeを使うと、全パーティクルに同じ値が適用されることになる。
ようするに最初は全パーティクルが透明で、5秒に近づくにつれ、全パーティクルの透明でなくなる。
これが狙った効果ならこれでもよいかもしれないが、パーティクル単位のエクスプレッションを使わなくてもできる。


「age」を使った場合、フレームの位置に関係なく、個別のパーティクルの年齢に応じて、透明度がかわる。
たとえば、フレーム5にエミットされたパーティクルも、フレーム20でエミットされたパーティクルも一様に生まれてから5秒かけて透明度を変化させることができる。



メモ:linstepの引数に文字列が使われているため、linstepの引数として使用する前に、それを数字に変える作業が先に必要となる。
そのため( )が使われている。

(参照:オンラインヘルプ
文字列引数を引用符で囲む必要があります。たとえば、$faces がオブジェクトのフェース数を表している場合、( ) を使用して、出力する文字列を構築することができます。

 

2009年5月30日土曜日

返品!! PogoPlug (13)

Pogoplugに関するこんな記事がlifeHackerにありました。

あと二年で半額だそうです。
まぁそのころにはそれでも若干高いような気もしないでもないが、Webサービスはより拡充すると思われるので、値段相応と言えるかもしれない。


さて、Pogoplugのblogやコミュニティーを久しぶりにみていると、webアプリがアップデートされ、新しい機能がいくつか追加されていた。

●ファイル検索機能(ドライブ全体のみ)
●シェアしたい人のE-mailアドレスを登録するときにメッセージを送る機能がついた。
他にもいくつかあったが特に必要無いことだったので省略

また、ローカル環境でしかためしていないが、m4vとmp4ファイル(アップルの予告編)に関しては、web上で再生できることがわかった。ただしm4vのサムネイルは表示されない。
movファイルは再生は出来たが音声がでなかった。
avi、mpgは静止画として表示はできるが動画再生は非対応と言う状況は変化無し。
(おそらくこれからも非対応:コーディングの都合から負荷が高すぎるようです)



久しぶりに使った感じでは、悪くはないかなという感じ。
ただ大容量ファイル転送、動画再生には期待は出来ない。

ほしいものとしては、写真のコメントもしくはタイトルを表示できる機能。
それに、FTPやプリンタサーバー機能もあれば言うこと無しだが。
1週間ほどつかってみよう。

 

2009年5月29日金曜日

時間に関する名称の混乱

パーティクルを使っているときに、時間に関するキーワード、アトリビュートや変数によく出会う。

なんとなくわかったつもりになって使っていたが、エクスプレッションで使う際にキーワードとアトリビュート名が混乱している。

頭を整理するために調べてみた。


--------------------
--------------------
time キーワードと frame キーワード

これはパーティクルに限らずエクスプレッションであれば使うことができるものだ。
機能は、フレームレンジでの現時点の値を返すだけ、変更は出来ない。

オンラインマニュアルでは、関数でも変数でもなく「キーワード」として扱われている。

使い方は変数と同じ。
現時点の、「ミリ秒」もしくは「フレーム数」が格納された変数と考えればよい。



---<time>---

time: タイムライン上の現在地(時間)

秒数

24fps:1フレームあたりの時間は、1(秒)÷24(フレーム)=0.041666666・・・ =>0.0417秒(41.7ミリ秒)
30fps:1フレームあたりの時間は、1(秒)÷30(フレーム)=0.033333333・・・ =>0.0333秒(33.3ミリ秒)

注意:似たものに「timeノード」がある。
これは、秒数ではなく現時点のフレーム数を出力する。
混乱しやすいので注意


---<frame>---

frame: タイムライン上の現在地(フレーム数)。

フレーム数




--------------------
--------------------

パーティクルのアトリビュート

これはパーティクル・シェイプに存在するアトリビュート
age以外は、それぞれユーザーが設定、変更できる。
アニメーション操作は、キーフレーム、エクスプレッションが可能。


---<age>---


age: (年齢) 各パーティクルが最初のフレーム以降、存在する秒数。

秒数。変更不可。

ヘルプ内に詳細の説明を見つけることは出来なかったが、1フレームあたりの秒数なので計算方法は「time」キーワードと同じだろう。



---<currentTime>---

currentTime: マップされているフレームを示している。パーティクル全体に影響

フレーム数

注意1:デフォルトではtimeノードにコネクトされており常に現時点のフレームを示している。
注意2:キーフレームでコントロールする場合、全フレームをカバーしている必要がある。
もしキーフレームが100フレームで終わっているならそれ以降のパーティクルはなにも動かない。


以下にキーフレームでコントロールしたときの関連を示す。
実際のフレーム        currentTime
001-100(100フレーム)    001-200(200フレーム)   (2倍の速度)
101-200(100フレーム)    201-250(50フレーム)   (半分の速度)

上記の例であればフレーム100を過ぎた時点で、パーティクルの全スピードが半分になる。

キーフレームの付け方次第で、マトリックスのようにリアルタイムから超スローモーションへ、そしてまたリアルタイムに戻るような、タイムワープをスムースに作ることができる。

参考までにオンラインヘルプの解説は以下の通り
それぞれのパーティクル オブジェクトには、パーティクル エフェクトを遅くしたり早めたりするようにアニメートすることができるカレント タイム(Current Time)アトリビュートがあります。このアトリビュートは独立した時刻の値を含みます。基本的には、パーティクル オブジェクトのクロックを遅らせたり早めたりして、作用するダイナミクスを遅らせたり早めたりします。




---<lifespan>---

lifespan: パーティクルの寿命を設定する。

秒数。
lifespan「1」=1秒を示す。

24fpsの場合、24フレーム経過したときにそのパーティクルは消滅する。
24fpsの場合、1フレームは、0.0417秒(41.7ミリ秒)に相当。

関連するアトリビュートがいくつかあるが詳細はヘルプを参照。
「lifespanAttributes」で設定したり「lifespanPP」にエクスプレッションを作成して使用する。

「lifespanAttributes」で「Randam range」を使用する場合。
「LifespanRandam」の値は、lifespanの値から+-の範囲を示す。

lifespan: 5
lifespan Random: 4
と設定した場合、5から、プラス値へ2まで、マイナス値2までのランダムの値になる。



----------------------------------------
<<まとめ>>

何を明確にしたかったかというと、
1)それぞれがどんな値を返してくるのか(フレームなのか?秒なのか?)
2)どれが読取り専用でどれが変更可能か?


簡単にまとめると以下のようになる。
time:   ミリ秒(読)
timeノード:フレーム(読)
frame:   フレーム(読)
age:    ミリ秒(読)
currentTime:フレーム(読・書)
lifespan:  秒(読・書)



名前に「time」という単語が含まれいるとどうしても秒数を連想してしまう。
しかしながら「timeノード」と「currentTime」はフレーム数を扱う。
また「age」「lifespan」はフレームで制御したいところだが秒数になっている。

これらが混乱の原因だったと思う。

 

メモ:Webサイト「○×つくろーどっとコム」

○×つくろーどっとコム


ちらっとみただけですが、CGに関係する数学やプログラミングの知識が、とても詳しく、イラストも多用され、わかりやすく説明してあるようです。
とても整理された感じがあり、初心者が本格的に学んで行くには、良い参考書になりそうです。

特に「ゲームつくろー!」のページはすごいです。

DirectX用のプログラミング解説なので直接MELに応用はできませんが、数学的な理論について学ぶには十分かと思います。

最近、その存在を知った「クォータニオン」も、「DirectX9技術編」の「クォータニオンを学んでみよう!」で解説されています。

数字が4つ集まったもので、言ってみれば4次元ベクトルです。3次元ベクトルであれば縦横高さで何となく想像ができますが、4次元となるともうドラえもん しかわかりません(笑)。この原稿を書いている私も、実は何のことやらさっぱり。そこで、私と同じような境遇にいる皆さんにも理解できるように、この クォータニオンを1から学んでみようと思います。

と書いてあるようい、難解な物をわかりやすくしようという意図が伝わってきます。
中身も、何が重要なポイントかわかりやすく書かれており、小難しい数学書で要点をつかむのに時間を掛ける必要がないとしたら、すばらしいことです。



そのほかにも「衝突判定編」をみると、CGをやっていく上で避けられない「内積と外積の使い方」や、VFXに関連する「点と点」(の衝突)などがあります。


内積と外積のページには、はじめに以下のように書かれており

内積は高校で、外積はたぶん大学で習います。そのきちんとした意味を理解するのは大切ですが、ゲームで使う上では性質を体得する方が近道かと思います。そのためにはイメージが大切です。

純粋な学問としてではなくあくまで実用を目指した理解が主眼であることがわかります。


 

メモ:ミケランジェロの言葉

「芸術家として他に秀でようと思ったら、気が向こうと向くまいと、 朝も昼も夜も一心不乱に制作に打ち込むべきだ。それはもはや楽しみの域を越え、苦行と呼ぶにふさわしい」

(ミケランジェロ:竹内均訳 S.スマイルズ「自助論」

まさに行動あるのみというか、楽しいかどうかと言うことよりも、制作という行為を継続することによってのみ優れた能力を身につけることができるということか。


 

メモ:パーティクル単位アトリビュートに関して

(オンラインヘルプ:パーティクル単位のアトリビュートとオブジェクト単位のアトリビュートについて


位置、速度、アクセラレーションの各アトリビュートは名前の末尾が PP ではありませんが、パーティクル単位のアトリビュートです。

パーティクル単位のアトリビュートを使用できるのは、パーティクル エクスプレッション内に限られています。

オブジェクト単位のアトリビュートは、パーティクル エクスプレッションと非パーティクル エクスプレッションの両方で使用できます。


ランタイム エクスプレッションを使用して、数多くのパーティクルを含むパーティクルオブジェクトのオブジェクト単位アトリビュートの読み取りや書き込みを行う場合は、それらのアトリビュートを非パーティクルエクスプレッションで読み書きすれば、エクスプレッションの実行スピードを上げることができます。

 

メモ: velocityの調整

(オンラインヘルプ:作成エクスプレッションを書き込む)

以下のクリエイション・エクスプレッションによりパーティクルの速度を制御する。

particleShape1.velocity = <<0,1,0>>;

アニメーションを再生すると、すべてのパーティクルが 1 グリッド / 秒の速度で Y 軸に沿って移動します。


このヘルプの例では、パーティクルツールで作った物なので、全体が一度に移動するが、これをエミッターからのパーティクルに適用すると「omni」エミッタを使っていてもDirectionalのようにパーティクルが発生する。
またそれに対してフィールドを適用することももちろん可能。

これをランタイム・エクスプレッションにも同じ物を使うと、毎フレーム計算されるので、フィールドの影響はかなり少なくなる。