Papervision3D の InteractiveScene3D(4)
2007/08/13 21:15 - Papervision3D
「papervision3D 1.5 でマウスイベント」でご紹介した Culling_InteractiveDemo や同じ作者による別のサンプルでは、マウスイベントによりグローフィルターが発動しています(以下、これを<A>とします)。
一方、私が「papervision3D 1.5 でマウスイベント」にてアップした自作コードでは、フィルターの適用ではなく、オブジェクトのスケール変更をおこなっています(以下、これを<B>とします)。
なぜ<B>では<A>のようにフィルターを使わなかったのか。
実はフィルター適用がうまくいかなかったからなんです。 これが躓きのそもそもの始まりでした。
<A>の前者のコードを見るとフィルター周りは以下のようになっています。
1) scene3d.interactiveSceneManager.addEventListener( InteractiveScene3DEvent.OBJECT_OVER , handleMouseOver ); 2) private function handleMouseOver(e:InteractiveScene3DEvent):void { e.sprite.filters = [ new GlowFilter( 0x20ADCD, .75, 20, 20, 2, 1 ) ]; } PV3D_1_5_Culling_InteractiveDemo より マウスオーバーに係る部分のみ抜粋。 適宜改行を入れてあります。
上記コードの 1) の部分から分かるように、InteractiveScene3D のイベント管理では、イベントオブジェクトとして InteractiveScene3DEvent というカスタムイベントオブジェクトを使います。
そして、その InteractiveScene3DEvent のイベントリスナー登録先は scene の interactiveSceneManager というプロパティになっています。
この InteractiveScene3DEvent というイベントクラスは org.papervision3d.utils.InteractiveSceneManager.as や org.papervision3d.events.InteractiveScene3DEvent.as を見るに、どうやらマウスイベントについてのみ定義されているようです。
次にコードの 2) の部分、イベントハンドラの定義を見てみます。
イベントオブジェクトのプロパティとして sprite というものが返ってくることが分かります。 その sprite のプロパティに filters が記述されていることから考えるに、その名のとおり Sprite 型のインスタンスなのでしょう。
ところで私は<B>のコードを記述するに当たって、<A>のうち前者ではなく、後者の記事中のコードを見ながら、以前から作ってあった自作の Papervision3D 用フォーマットに手を加えるという手法でコーディングしました。
でもそれだとなぜかフィルターが適用できなったんです。
公式サンプルと同じ記述をしているのにフィルター適用がされない理由は一体なんなのか?
このときはその理由が分からず、仕方ないのでマウスイベントとしてマテリアルのスケール変更という楽な方に逃げた結果、<B>のようなコードになったのでした。