『Flash AS3 学習』
var speed:Number=3;//変数定義、値は大きければ大きいほど遅くなる
my_mc.addEventListener(Event.ENTER_FRAME,myEnterFrame);
function myEnterFrame(event:Event):void{
var targetMC:MovieClip=MovieClip(event.target);//一旦ターゲットされているMCを変数定義
targetMC.x+=(stage.mouseX-targetMC.x)/speed;//X軸に差分を追加
targetMC.y+=(stage.mouseY-targetMC.y)/speed;//Y軸に差分を追加
} 今のこの瞬間に位置しているムービークリップとマウスの位置を引いて、その差を毎フレームを変数speedの数だけ割る、結果徐々に間隔が狭くなります。
var spd:Number=0.55;
var moveX:Number=0;
var moveY:Number=0;
my_mc.addEventListener(Event.ENTER_FRAME,myEnterFrame);
function myEnterFrame(event:Event):void {
var targetMC:MovieClip=MovieClip(event.target);//一旦ターゲットされているMCを変数定義
moveX+=(stage.mouseX-targetMC.x);
moveY+=(stage.mouseY-targetMC.y);
moveX*=spd;
moveY*=spd;
targetMC.x+=moveX;
targetMC.y+=moveY;
}
まるでゴムで引っ張っているような動きを見せるには、一旦X,Y座標ともに目的地までの座標との差分を変数に代入したあとに、ある数字を乗算してしまうと、目的座標を飛び越え、戻ろうとする。
ちょっと前の慣性を持った動きの応用で、四角形の四隅にマウスイベントを持たせて、ドラッグで引っ張られて戻るとき「ボヨヨン」なバネの動き。
今回はクラス分け。
『MyPoint.as』、『PointEvent.as』、『BasicSpring.as』の3ファイル。
先にスプライトをインスタンス化しておいて、それをコンテナにした上で、1フレーム目に・・・
で呼び出します。
MyPoint.as ↓↓↓↓↓↓↓↓↓
PointEvent.as ↓↓↓↓↓↓↓↓↓
BasicSpring.as ↓↓↓↓↓↓↓↓↓
物理ライブラリ、Box2DFlashAS3 2.0.1を使ったフラッシュブログを作ってみました。
今は一覧の写真をダブルクリックするとタイトル、コメント、写真だけが表示されますが、もうちょっと工夫をこらしてみたいと思います。
ちなみにこのブログ記事の内容はMovableType4用に作っていますので、3だと、ちょっと仕様が違うので、検討が必要かな?
というのも、画像をアップロードした時の吐き出しタグ、画像の原寸とは別にサムネイルをMTが作ってくれるので、それを利用しない手は無い!と思って、デフォルトで吐き出されるソースを利用すれば、ユーザはわざわざサムネイルを別途作る必要も無いので、以下のソースをそのまま利用します。
以下がMovableTypeが吐き出すアップロードした画像のソースコード
<form mt:asset-id="148" class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="ここに原寸の画像のURLが吐き出される"><img alt="alt属性" src="ここにサムネイルの画像のURLが吐き出される" class="mt-image-none" style="" height="サムネイルの縦サイズ" width="サムネイルの横サイズ" /></a></form>
AS3側でXML分析に使うスクリプトの一部
public function parse():Array{
var total:uint=xml.entry.length();
〜中略〜
MTArray[i].push(xml.entry[i].picture.span.a.img.@src);
MTArray[i].push(xml.entry[i].picture.span.a.@href);
〜中略〜
return MTArray;
}
xml.entry[i].picture.span.a.img.@src・・・でサムネイルのURL
xml.entry[i].picture.span.a.@href・・・で原寸画像のURL
AS3になってからXMLデータの絞り込みが楽になりました、ただ、気をつけないといけないのは、こういったHTMLソースをXMLファイルの中に入れて管理する場合は、Flashブログ用の言語はXHTMLをおススメします。
HTML 4.01以前の場合だとXML解析エラーが起こる場合があります。
それは<br><hr><img>といった「空要素」は、終了タグを省略しているのでAS3ではエラーが起きます、例えば<img>で始まって終了タグが無い場合、コンパイルエラーで『</img>が必要』みたいな事を言われます、なのですが、XHTMLのように、『<img />』なら問題ないので、こういったケースの場合、おススメというよりむしろXHTMLにするべきと言えるでしょう。
このシンボル、Spriteがスーパークラスになったので、タイムラインにムービーを入れたから当然エラーが起こるかな?って思ってパブリッシュしました。
ところが意外に、エラーは無く、ただ、止まっている状態です。
おそらく、Spriteクラスなのでタイムライン機能が存在しないため、1フレーム目があってもいけないと思いますが調査してみよう。
単純に入れ子になったという意味ではDisplayObjectContainerの機能だけで充分だが、同名で基本クラスでリンケージできないです、MovieClipに戻ります。
しかしこのドラムセット、まだテストしているので、スネアとハットのみ、それも右手のリモコンがハット、ヌンチャクがスネアを鳴らしているだけのお試し状態。
しかし結構、これだけでも楽しめます、昔バンドでドラムを叩いていたときを思い出したけど、このリモコンの振ったタイミングが鳴るタイミングと見事にずれてしまうし、2度鳴りを起こして、ギターのエフェクターでいう「フランジャー」みたいな気持ち悪いスネアになってしまう。 でも、これでリモコンと連動できるようになったので、創作活動にやっと入れます。
まずはWiiFlashの独自のクラス、メソッド、プロパティを憶えるという地味なところから行きます、待っててね。 (ちなみに写真ではフラッシュが立ち上がっていて、スネアとハットを鳴らしてます、音は外部ファイルを読んでます。) ちなみに以下がテストコードです。(適当な手抜きです、すいません)
フレームアクションにて
ActionScript 3.0の地図ライブラリ・・じゃなくて、コンポーネント、『UMap』。 とても便利そうだし、表示させるだけならそんなに難しくないです。 ただ、ダウンロードして使えるので、チャレンジしてみました。
これ、もしかしたらこんなタイトル入れていて、もしそういったクラスがあればすごい恥ずかしいんですが、GoogleEarthみたいなレンダリングバーが出来たら、仕事などで実装する場合、ユーザの目線で見たらいい感じなんじゃないかな?と思って。
やっぱり、待ってる間、タイルが出っぱなしだとカッコ悪いような気がして。
コンポーネントをダウンロード
ダウンロードしたら、Adobe Extention Managerで機能を拡張します。
そのあたりは書籍Flash OOP for ActionScript 3.0にも掲載されてました、ご一読をおススメします。
さて、一旦UMapコンポーネントをステージにドラッグして消して(ライブラリに登録して)すぐに表示される。簡単で、申し訳ないくらいです・・
しかも座標はGoogleMapと一緒だし、だからhttp://www.geocoding.jp/で分かるし。
ローディングイベントはMapLoadEventで!
LoaderInfoクラスを使ったProgressEventと同じ感覚です。
event.bytesLoadedの代わりにevent.currentTile
event.bytesTotalの代わりにevent.totalTiles
タイルなんですね!よく出来てる!!と思います。
なので、パーセンテージを調べるにはevent.currentTile/event.totalTilesでいいんですね。
Special Thanks CSS Nite様
Flash上で3Dレンダリングを行ってくれる有名なライブラリ、Papervision3D 2.0 Alpha - Great Whiteで、複数のPlaneのサブクラス、WiiPlane(!?)を配置して泳ぐように浮かんでいるCSS Niteのロゴマーク。
Papervision3D 2.0 Alpha - Great Whiteでは、BasicViewというクラスが存在しています、便利なんでしょうが、詳しく調べると、AbstractViewクラス、さらにその親クラスのSpriteを継承しているようです。
で、色々なサンプルを拝見させていただきましたら、いきなりsceneにprimitivesパッケージ内のオブジェクトをaddChildしているので、いったいどこでインスタンスを作ったんだ!?と悩んでいたんですが、AbstractViewクラスを確認してなかったですね、しっかりと
なんて書いてありますね、確認確認・・と。
なので、sceneという3D空間にPlaneのサブカスタムクラス、WiiPlaneクラスのインスタンスをaddChildしてます。
ロゴマークは外部ファイルとして置いていますので、BitmapFileMaterialクラスを使って外部ファイルを読み込みします、ただ、Cubeオブジェクトは6面体なので、MaterialsListを使わないといけないみたいです。
そんな訳でソースコード。
『CSSNite3D.as』
『WiiPlane.as』
ところで、なぜ、『WiiPlane』??
Wiiと来たら!?
果たして、CSS Nite in Osakaまでに間に合うかどうか・・・。
※CSS Nite様のロゴの使用を許可していただきました、本当にありがとうございました。
本日アップルストア心斎橋にて行われました『CSS Nite in Osaka, Vol.12』に出演してきました。
皆様のご清聴のお陰で無事、セッションを終わらせる事が出来ました。平日の割には予想を上回る大勢の方にご参加いただきました。
ノンプログラマーとして、ノンプログラマーへのプレゼン的のようなActionScript 3.0のセッションでした。
プレゼン音声資料に関してはこちらもご参考ください。
足りないサンプルファイルがありましたので、現在選別して公開させていただいております、特に『写真アルバム』のAS3サンプルファイルがないというお声をいただいております、近日、必ずアップします。
あと、補足ですが、スライド内では『変数の型指定』については省略させていただきました。お配りした用紙をご参照ください。
撮影:岡田陽一
色々なご意見をいただきました。

スライドを公開させていただきます。
スライド『「脱・やらず嫌い!Flash ActionScript3.0 入門以前編」swfファイル 8.1MB』はこちらから
折り込みプリントが足りなくて、お届け出来なかった方、入ってなかった方、PDFファイルで、公開させていただきます。
どうぞ、ご活用くださいますよう、よろしくお願い申し上げます。
折り込みに僕のプリントが入ってなかった方はこちら。PDF形式でダウンロードいただけます。
皆様のお声をまとめて、お返事させていただきました。
| AS3から始めてもいいかな、と思うような内容でした | それで良いですよ! |
|---|---|
| 感覚的にわかりやすい内容でした!つれが光GENJIのカー君に似てると言ってました。 | むかしはジミー大西似だったんだけどね(笑) |
| スピードが速かったのもあってなかなか難しかった | 反省点、ご意見参考にさせていただきます。 |
| 詳しく知りたい | またご一緒に勉強したいですね。 |
| これを機に始めてみようと思いました。 | 僕にも始まりがありました、いいきっかけになれば良いのですが・・ |
| やる気が出てきました。写真ブログのトップ作りたいです。 | 上達の半分はモチベーションかもしれません。 |
| もっと聞きたかったです。 | もっとしゃべりたかったです(苦笑) |
| 入門講座にもっと参加したいと思います | 僕にも出来る事があれば良いんですが・・ |
| AS3の特徴の良く分かる解説だったと思います。 | ちょっとマンガちっくだったんですがね〜 |
| AS3の文法がどのようになっているか少し分かったと思います | スライドでは「型指定」を省略してます。お配りした用紙をご確認ください。 |
| AS3勉強します!!でもすごく分かりやすかったです。 | 僕もお役に立てるよう、情報を増やします。 |
| 面白かった~中略~でも遊びよりお客さんに出せることを見たいですね。 | 遊び過ぎでしたね(汗)実用的な内容も欲しい、、確かに。 |
| 一度頑張って勉強してみます。 | はい!何度でも!! |
| もっと聞きたいです。 | 何か機会を作りましょうか・・。 |
| 使ってみようと思います | じっくりあきらめずに。 |
| これから勉強しようと思えました | それだけでこのセッションは大成功です。 |
| プレゼンが分かりやすかった | かなり初学者に目線を向けました、本当はもっと盛り込みたかったんですが・・ |
| てんこもりでよかったです。 | 最初はもっとてんこもりだったんですよ! |
| 勉強します | がんばって! |
| やっぱりちょっと難しかったかも、でも話は分かりやすかったです。 | そうですか、反省してさらにプレゼン能力を高めたいと思います、ご意見ありがとうごさいます。 |
| HTML5+JavaScriptの動きも気になります | 最近はJavaScriptを使ったリッチなサイト、流行ってますね、すごくいいと思いますよ。 |
| スピード感があったけれど難しかった | なるべく早口にならないように、と、臨みましたが、今後の反省点と参考にさせていただきます。 |
| 何となく分かって挑戦してみようと思いました。 | あせらずにやってみてください。 |
| どんなものか一度触ってみたいです | 興味をもつことも大事ですね、簡単なものから触ってみてください。 |
| 挑戦します!! | チャレンジ精神で! |
| もうちょっと踏み込んだAS3が聞きたかった、しかし入門であれば高いハードルが低く感じられるものでした。 | そうなんですよ!あくまで「入門以前編」ということで、ご理解いただけたらと思います。 |
| 一度離れましたがこれを機会にトライしてみたい | そうですか、ぜひトライしてみてください。 |
| 少し難しかったので帰ってデモを触ってみようと思う | スライドだけだとなかなか難しいかもしれませんね、ぜひ手を動かして触ってみてください。 |
| 最近流行のライブラリについて聞けてよかった | ほんの一部、さわりだけでしたね。 |
| 2~3時間くらいのPCありの講座があったら行きたい | 検討させてください。 |
| ピンチになったら秋葉さんのスライドを読み直そうと思いました | あと、サンプルとお配りした用紙も見直してみて下さいね。 |
2008年11月26日(水)にアジア太平洋トレードセンター(ATC)内ITM棟6階 PCトレーニングルームにて、「『脱・やらず嫌い!』デザイナーのためのFlash ActionScript 3.0 ノンプログラマー編」という、CSS Nite in Osakaのセッションと似たタイトルで、セミナー講師をつとめさせていただきます。
主に、イベント取り扱いや表示オブジェクトの基礎操作、外部ローディング方法、XMLとの連携などの基礎的動作を実際にPCを触りながら体験しながら学べる内容となっております。
ただ、お堅い内容ばっかりでは面白くないから、この間CSS Nite in Osakaでお見せした、
『Papervision3DとWiiリモコンで遊んでみよう!』
という内容を『番外編』としてカリキュラムに入れました。
こちらもちょっとだけ、AS3を使ってWiiFlashServerと連携させてWiiリモコンのイベントを受けて『楽しむ』というお時間も設けようと思っております。
簡易だけど、初心者には濃い秋葉手作りのテキスト付きです。
なるべく楽しく、かつ、しっかりと学べるセミナーにしたいと思います。
今回の講義の受講スキルとしては、ASそのものが未経験、プログラミングにハードルを感じているデザイナー職の方など、Flashはアニメーションしか出来ないという初級入門編というレベルの方対象です。
詳細とお申し込みはイメディオのサイトから。
http://www.sansokan.jp/events/eve_detail.san?H_A_NO=09033
カーソルキーで動かしてください。
あんまり複雑にならないように、立体迷路を作ります。
- XMLを読んで、地図を解析する。
- XML通りに壁を作っていく(Cubeクラス)
- Cubeオブジェクトに貼るマテリアル(テクスチャ)には取り急ぎ1枚の画像で間に合わせる。
- 移動キャラにはこちらもまずは紙飛行機オブジェクト(PaperPlane)を使う
- 紙飛行機はカーソルキーで左右に向き(角度)を変える
- 紙飛行機の移動はカーソルキー上下で行う
- カメラが紙飛行機の後を追従していく
- カメラは角度も紙飛行機の方角を狙い続ける
- 紙飛行機が壁に衝突したらそれ以上進まないようにする
まず、XMLの読み方としては、多くの方がEventDispatcherクラスを継承したXMLを読み込み完了したイベントを知らせるクラスを経由した後に解析する事が多いですが、ひとまず簡単に省略してしまいました。
外部に配置されているXMLファイルはこんな感じです。
0が通路で1が壁。それだけで試してみます。
一度Scene3Dクラスでシーンを作成してカメラはCamera3Dクラスを使います。
Viewport3Dではレンダリングする範囲などを決定させるために、第1,2引数にはステージサイズを入れておいて画面いっぱいを表示範囲にしてしまいましょう。この3つのオブジェクトはレンダリングする時に必要な要素になります。
さて、それらをレンダリングするエンジンとなるオブジェクトを作成するためにBasicRenderEngineクラスを使う、先ほどの3つのオブジェクトはこれによって関連付けられます。
DisplayObject3DクラスのインスタンスrootNodeを一つ作ったら、その中に『表示3Dオブジェクト』を入れてあげると階層3D空間を作る事が出来ます。
インスタンスrootNodeの中に紙飛行機PaperPlaneクラスのインスタンスをaddChild、さらにXMLを読み終わったら解析をして、配列にCubeオブジェクトを作成しながら、こちらもインスタンスrootNodeにaddChildさせるだけです。
Cubeオブジェクトの場合テクスチャを貼る場合は他クラスとちょっと違ってMaterialsListで各面に何を貼るか?を設定出来るのですが、複雑さを避けるため全面同じ画像を貼ります。
あとは、2重ループで1個づつCubeを配置してずらしていきます、このとき、出来たらXMLで書いた通りの順番に配置していきたいので、for文はデクリメントで回していきます。
csvデータの様に、カンマ(,)区切りなので、splitして配列に直していきます。
6列×5行なので、合計30回のループですね。
後で衝突判定用に別途配列wallArrayを作成して、マスが0の場合通路なので、Cubeは作らずに
wallArrayにはnullを代入します。カメラがターゲットの向きを向きっぱなしにしたいため、三角関数atan2を使ってやっと出来たんですが、Papervision 3Dにはカメラにtargetって便利なプロパティがあるのを知らず、一生懸命計算してました。
衝突判定でまずやるべき事は、紙飛行機にどの壁(Cube)が当たっているか、とりあえず最も簡単なやり方、hitTestObjectメソッド(物理的にはこれではいけない場合もあるかもしれません)でいきます、先ほど作り直した配列内のCubeに総当たりで衝突判定をします。if文の条件ですが、配列にはCubeかnullが入っているため、まず配列に入っているオブジェクトの型はCubeなのか(nullじゃ無いのか)、それと、そのCubeが紙飛行機と衝突しているか、この2つがtrueの場合のみ、変数hitWallBlockに当たってるCubeを代入して、degreeLimitterメソッドを実行し、breakでそこでループ処理を中断します。

今回の移動制限の方法として、まず三角関数Math.atan2によって、紙飛行機と衝突している壁の距離が解るので、そこから2者の角度を出して180度逆の方向をはじき出します。
通常の移動量の分だけ、逆の方向にX,Z座標を移動させておけば、壁を突き抜けないようになります。
あと、3Dオブジェクトの移動はDisplayObject3DクラスのmoveLeft()などが使えるらしいんだけど、今回はそれを知らずにx,y,zで移動してしまいました。今日はとりあえずここまで。次回はColladaオブジェクトで迷路を徘徊したいです。
さてそんなわけで、今回はクリックすると粉になって落ちていくFlashを作ってみました。
仕組みはステージにオーサリング上で配置したムービークリップをBitmapDataでdrawしてそいつをgetPixels()メソッドでByteArray配列に入れてみる。
色ごとに入れられるようなので、ByteArray.positionで一旦0地点に戻してそこからARGBの4チャンネルを1ターンとして抜いた後に1ピクセル分のBitmapDataを作り直し、BitmapData.setPixel()で、ピクセルを設定したら、Bitmapのx,y座標を入れ直して、超重たい作業をしてみたら・・・。
激重でした。
約1万ピクセルを一斉に動かすのは負荷がかかり過ぎなので、1ピクセル分のBitmapクラスを継承させて新しいカスタムクラスを作ってそれを下から順に落としていく事で一斉には動かさずに済むので、まあ割とマシかもしれません。
プログラマの方たちはもっと効率よく組むんだろうな〜
なんか無駄が多いような気がしてなりません。
一度画面をクリックされた方がよろしいかと思われます。
ココ最近、どうもFlashの話題でブログを埋めてますが、ワタクシ、最近Autodesk Mayaを勉強し始めました。今までの3DCGでは、Lightwave 3D,Shade,Vueなど、割とソフトの価格も安い方のソフトを使い続けていました。やはり3Dは面白いです!最近のPS3のゲームのクオリティを見ると、確かにゲーム性が悪い訳ではないんだけど、その洗練された3DCGグラフィックだけで、何度もプレイして一人で感動してます。
「自分には一生こんなの作れないんだろうな〜」と思いながらも、ついに、ハイエンドなAutodesk Mayaを勉強し始めてしまうことにしました、頑張るぞ。
さて、3Dネタで申し訳ないんだけど、このままFlashで表現しやすいライブラリと言えば一番ポピュラーなPapervision3Dですが、最近面白くてこちらもハマってます、本業がプログラマじゃないから、ホント、FLASHerなんて呼ばれている人にはちょっと恥ずかしい限りではありますが、本日勉強して学んだ事を綴ります。
なぜ、ブログに書くかと言うと、まず自分のためなんですね。
一番自分が見やすい場所に書き留めておくって、ブログがいいんですね。
さて、今回登場してくださるオブジェクトの一部をご紹介いたします。

さらに、僕もたまに作る、「バンプマップ」にもチャレンジしました、ここで、3DCGに触れた事の無い方、バンプマップですが、複雑なポリゴンで表面を作るんじゃなくて、白と黒だけの画像をJPGなどで保存して、表面の凹凸をこのバンプマップで表現出来ます、特に光が当たった時には非常に効果的な質感を醸し出してくれます。今回作ったのは以下の2枚、表面の材質のカラーマップと、そしてバンプマップ。
これをそれぞれFlashに埋め込んで使います。

↑表面材質になるカラーマップ

↑凹凸を表現してくれるバンプマップ
さて、画像が準備出来たところで、コーディングに入るのですが、今回は以下のオブジェクトを作りました。
・・・といった具合です。 なぜViewport3Dが2個も要るかというと、一つは通常のレンダリング要素なんですが、もう一つは画面下に映りこんでいる鏡面の画像をこれで表示してしまおう、という事なんです、簡単に言うと、毎フレームレンダリングされた画像が、下に敷いてあるPlaneオブジェクトのマテリアル(テクスチャのようなもの)にする事が可能なんですね。
というわけで、この方法を使うと、水たまりなどの映り込みも表現出来そうですね。
なお、下から撮るカメラはFreeCamera3Dクラスにしました、名のごとく、か、分からないけど、結構使い勝手が良いように感じます。 さて、コンストラクタに入ってからも新しいオブジェクトは作られますが、主に、先ほど画像を紹介したテクスチャが貼り込まれます。
それぞれ2枚の画像は埋め込んでおく方が楽なので、ライブラリに登録、リンケージ化して、クラス名を付けてバンプマップを「BmapClass」表面材質を「BallMapClass」としてBitmapクラスの子分として登録、スクリプトでそれぞれのオブジェクトに関連付けるというわけですが、特に注意したいのがこちら、PhongShaderクラス。
スペキュラマップとはバンプマップと似てるけど、鏡面の材質の効果を表現するようなものですが、あまり効果は感じられませんでした、調べときます。 こういった場合、環境光をなるべく暗くするのが効果的ですね、光は闇でよく映えるわけです。
今までviewPortは1つだけ、なんて思っていましたが、そうじゃ無かったんですね、鏡のためのビューポート、そして全景のビューポートといった感じでしょうか。
僕の名刺です。チョイっとクリックしてみてください。
いつも縦の名刺ですが、今回ちょっと横向きなんてどうだろ?なんて思い、勝手にデザインを変えちゃいました、以外と僕の中では新鮮。
今回の勉強はDisplacementMapFilterクラスという、あんまり聞き慣れてなかったフィルターを使った練習をメモしておきます。
僕がよく生徒さんの前で講義に使うAdobe Photoshop等などには良く見かけるFilter機能ですが、これを使う事でワープ効果なんて表現も出来るらしい、ということで実験。
やってみると、波紋を出すポイントがずれて、最初は苦労したけどPointクラスとMatrixクラスをうまく使う事で座標をマウスクリックした座標に合わせる事が可能です。
これは単純にリンケージしたムービークリップシンボルのスーパークラスをわざとSpriteに定義しています。これが名刺の画像が入ったMCなわけです。そのままaddChildしときます。
続いて以下の定義というのは・・・
spriteはその中に波紋の元となる円をgraphics.drawCircleで3重丸を入れているSpriteで、これに対してまずベベルフィルタ(エンボスのようなもの)とフラーフィルタ(ぼかしフィルタ)をかける事で、波紋の形状が出来上がります。ただし、必要なのは、このSprite内の画像のBitmapData型の情報が必要なので、private var bm:BitmapDataを仮で定義しておきます。毎フレーム処理の時に、このBitmapdataにdrawすることで波紋の形状を更新しているわけです。
しかし厄介なのは、このdrawしている第二引数にMatrixで位置を移動させないと、円の真ん中から右下だけをdrawしてしまうので、このようにしています。
これによって波紋の円の左上から右下までしっかりとdrawしてくれるというワケです。
private var clickPoint:Pointにはクリックした瞬間のマウスの座標が入ります。これがDisplacementMapFilterクラスを実行している際に必要になってきます。
それでは本題のDisplacementMapFilter。
var pt:Point = 〜〜の部分はクリックされた地点を計算してPointオブジェクトに格納します。
さて毎フレームごとに上記のgetFilterメソッドが呼び出されます。
ここで一番ハマったのは、毎フレーム、呼び出しているはずなのに、波紋が大きく伸びていかない。なぜだ!?
で、さんざん試行錯誤したあげく、ヘルプにこんな事が書いていた。
フィルタ操作の潜在的な問題
なんじゃそりゃ?
で、調べてやっと解決の糸口が見えました、要はフィルタの中身を変形して更新するときは、一旦配列のコピーを作ってそれを適用させないといけない、ということで、
が要るというわけです。ちょっとまどろっこしいけど、一応これで解決してます。
DisplacementMapFilterコンストラクタへの引数はいっぱいあって、色々試してみましたが、一番しっくり来たのがこの値でした。ちなみに3,4引数のBitmapDataChannel.RED定数はBLUEでもGREENでも、結果はこの場合、同じでした。
5,6引数の100の値は大きいほど効果が目に見て現れやすいです。
DisplacementMapFilterModeは4つの定数の中で、CLAMPにしてみました。
あまり波紋が大きくなると、極端に重くなるので、波紋が広がっている間は次の波紋は出ないようにしてます。この辺は改良が出来そうです、研究しておきます。
まだ、ゲーム機が今ほどスペックが高くなかった頃、3D表現に例えば「木」をいっぱい配置するとき、ポリゴン数の節約のため、1枚にの板ポリゴンに1枚の木の画像を貼って、常にカメラを向いておき、カメラが木の横に動いたとしても、ペラペラの木だってバレない様に、木自身のY軸(縦の軸)を回転させる手法が取られていた話は有名で、「ビルボード」なんて呼ばれてたらしいです。
そんなビルボードの手法、使ってみたくてと思いつつ、木を使うのもオモシロくないし、何か無いかな?って何気なくひらめいたのがヒトダマ。
炎って形がとくに決まってないから、ビルボードを使うにはもってこいだ!と思ったんですね。
さて、炎をどう作るか・・・最近乾燥してるから家の中で炎は燃やしたくないなあ〜火事は恐いし。
そうだ、ソフトを使おう、確かAppleのタイトルムービー作成ソフト「LiveType」を久しぶりに使ってみよう。
LiveTypeには炎が入っていたはず。というわけで
メディアブラウザ>オブジェクト>パイロ>彗星にしてみる、なるほど、ヒトダマにも見えてきた。
そのままFlash Video Encoder(最近名前が変わったよね)に持ってきてflvにエンコード。
そのまま同じ階層でいい、置いておこう。 名前は「hitodama.flv」。
さて、背景どうしよっかな?と考えたあげく、背景は暗い方がフンイキ出ますね。
そんなわけで天空のテクスチャを作ることにした、んだけど、球体にテクスチャを貼ると、そのままじゃ極座標に行くほど変に画像が歪むんです。QTVRとか作ってる人って上手ですね、そのあたり。
で、僕はそんなことまで出来ないので、自然景観ソフト「Vue」を使ってみることにしました、ありがたいことに、「空を書き出す」コマンドが用意されている。
月夜、いい感じです、またこのサムネイルがフンイキを醸し出しています。
でも残念なことに空の書き出しだけではVue5 infineteのバージョンだと、本当に空だけしか書き出せないです、何か方法ないかな?天空を自分で作る方法もあるけど、かなり熟練しないと厳しいので、また練習しとこう。
今回はVideoStreamMaterialというPapervision3Dのクラスを使います、そうなんです、ビデオを扱うからですね。
普通、flvを扱うときって結構面倒です、少なくともVideoクラス、NetConnectionクラス、NetStreamクラスを使います、NetStreamは再生とか「今何秒?」とかを扱う役目で、再生したあとこれが制御役になるのです。
flvを読み込み、設定が終わったらVideoStreamMaterialへVideoとNetStreamを引数に渡すんですが・・・何だこりゃ?
アルファチャンネルが効いてない。
何か設定があるのか、と思い、まずはコンストラクタ、第三引数はprecise:Boolean = falseとなっていたので、trueにしても変わらず。
ヘルプを見ると気になるプロパティ「movieTransparent」が、継承元はMovieMaterial。
なにをいじってもダメでした。
GoogleCode調べてみると、なんだ、そうだったのか、こんなのがあった。
http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/materials/VideoStreamMaterial.as
VideoStreamMaterial(video:Video, stream:NetStream, precise:Boolean = false, transparent:Boolean = false)
と書いてあるので、バージョンの違いか、ひとまず修正。
中身を見てみると、うん確かに
super ( DisplayObject(video), transparent );
になってる。
カーソルキー上下で一応カメラポジションを変えてますが、もう少しいい動きを考えてみたいものです。
こんな感じで書いてみましたが、まだまだ勉強が必要ですね。
画像は僕が主催で行っている、謎のクリエイター集団の勉強会、『Splaaaash!』のロゴマーク。
デザインはtommmmmmmmyさん。
次回の勉強会は2月、デジタルハリウッド大阪校で。
カーソルキーの ← と → で、目線も変わるよ
まずは画面を1回クリックしてね
デジタルハリウッド大阪校の全面協力によって、無料ハンズオンセミナーが実現しました。
http://mixi.jp/view_community.pl?id=3997728
せっかくいっぱい集まったから、ノンプログラマー、ノンスクリプター同士みんなで何か一つのモノを作るってのもオモシロいかもなって思って、Papervision3DのCubeクラスを使って、Photoshopなどと組み合わせてフラッシュを作ってみようと思っています。
例えば、こんな感じ。
クラス名が「Class1〜Class30」みたいに連番になっている場合。
ループ処理で参照したくなる。
ところが、そもそもgetDefinitionByNameとは、swf内で定義されていないクラス名を参照しようとすると・・・
『 ReferenceError: Error #1065: 変数 Class1 は定義されていません。
at global/flash.utils::getDefinitionByName() 』
などと、怒られてしまう。
なんだ?と思いきや、結局リファレンスに書いてあるような
getDefinitionByName("flash.display.Sprite") as Class;
というのは、元々「flash.display.Sprite」が存在しているから、走るのです。
つまり、ActionScriptファイルであれば、しっかりとimportしてないもの、定義されてないものに関してはgetDefinitionByNameを使ったところで意味がなく、結局どこかでクラス名を定義しないといけないようです。
で、どう書くか・・・・?
こう書いたら動きました。なんか納得いかない!!
こんな書き方でいけるんだ。
↑↑↑読み込みに結構時間がかかります。
無償版で提供されているGoogle SketchUpを使って試してみました。直感的に操作が出来て、直線的な3Dオブジェクトなら割と楽に使えそう・・・・と思いきや、完成し、書き出したらコレがちょっと微妙〜(さらに研究中)。
というわけで、今日はSketchUpで書き出したColladaファイルを普通にDAEクラスで使うという流れで進めていきたいです。(Sketchupクラスは調べてからにします。)
なお、このエントリーは4月に行われる勉強会「splaaaash! Vol.3」の予告編・・・だと思っておいて下さい。
まず、SketchUpを起動します。
定規、邪魔ですね、選択してデリートします。
そして、四角形を書いてしまいます。
簡単に押し出せちゃいました。
その中に四角形を書いて、その大きさでくり抜くということも出来ます。
門を作ります、これもくり抜いちゃいます。
「写真を照会」コマンドで一気にJPG画像を貼付けるシーンです。
これで一旦書き出してみましょう。
↓フラッシュ上。いいんじゃないでしょうか。 ^O^
さらに直方体を作り・・・・
「写真を照会」で大理石を貼付けました。
看板でも作っとくか〜〜
さて、書き出しです。
「ファイル」→「書き出し」→「3Dモデル...」でこの画面。一旦kmz形式で書き出しました。
そのままだと、圧縮されたままなので、これを普通に解凍します、写真ではStuffIt Expanderへドラッグアンドドロップ!!するとdaeファイルやimagesフォルダの中には、テクスチャがしっかり分けて入れられてます。
ただ、これをswfファイルが読める場所に置かないといけないから、ちょっと、場所移動します。
あと、daeファイルの中身のファイルパスを書き換えてあげないといけないので注意が必要でした。
それでは結果は・・・ドキドキ。
あ、あれ?テクスチャが・・・・
続きは次回京都の「splaaaash!! Vol.3」で、みんなで遊びましょうっ。
ご予約はまもなく募集開始しま〜す。
ひとまず、mixiコミュニティー上から募集開始なので、
http://mixi.jp/view_community.pl?id=3997728
まで、コミュ参加をしておいて下さい〜〜。
詳細はそこからお伝えさせていただきますので!、ではお疲れさまでしたっ!!

連載の今回は3記事を寄稿しました。
で、6/9のCSS Nite in OSAKA@アップルストア心斎橋では、私、秋葉秀樹が出演します。
http://osaka.cssnite.jp/
内容は執筆記事をライブコーディングします。
なぜなら、ActionScriptクラスファイルの記事を書いていますが、入門者にはクラスの概念が分かりずらいということで、フレームアクションで書きながら一部をご説明って感じにします。
MTで書き出されたXMLをFLASHで読み込み、サムネイルをロード、表示まで、実際みなさまの前でActionScriptを書いて実行してお見せしながら解説します。
ただ、経験者にはツマラン内容となること間違い無し!です。
photo by おかだよういち http://s-style-arts.info/
何と大阪版始まって以来のアップルストア心斎橋での動員数、160人を突破したこのイベント、ついに無料版マンスリー終結を迎えました。多くのご来場、まことにありがとうございました。
今回私のトピックは「脱!やらず嫌い『MovableType×Flashでつくるフォトアルバム』-ノンプログラマ編-」(いつもながら長いタイトルだ・・・)と題しまして、web creators 7月号に寄稿した、MTとFlash連携での記事を、もっと入門者向けに設定してご説明、あと、ActionScriptのライブコーディングを行いました。
スライドはこちらからご覧いただけます。 http://www.akibahideki.com/blog/cssnite/cssniteosaka_16_akiba.pdf (PDF形式:8.6MB)
今回は最終回という事で、『アップルストアにぶっちゃけ、聞きたい事がある!』と、「オレたちロックだもんね♥」的なノリでストアの上島さんに「みんなも聞きたい質問」をぶつけました。 来場者のみなさん、いかがだったでしょう?
ライブコーディングした内容です、執筆内容はActionScriptクラスファイルでしたが、フレームアクションで今回は書きました。



