Papervision3D の InteractiveScene3D(6)
2007/08/15 20:31 - Papervision3D
InteractiveScene3D における InteractiveScene3DEvent.sprite(以下前回同様 "sprite" と表示)のアルファ値が 0.00390625 などというほとんどゼロに近い値であることが判明して驚愕した、というのが前回の話でした。
なんじゃこりゃあ、ってことで、Culling_InteractiveDemo のソースコードを再度見直してみたところ、下記のような記述を発見しました。
1) InteractiveSceneManager.DEFAULT_SPRITE_ALPHA = 1; InteractiveSceneManager.DEFAULT_FILL_ALPHA = .3;
これらの変数名で Grep をかけると org.papervision3d.utils.InteractiveSceneManager.as に定義があることが分かりました。
2) public static var DEFAULT_SPRITE_ALPHA : Number = .0051; public static var DEFAULT_FILL_ALPHA : Number = .0051;
デフォルト値が 0.0051 で実際の値が 0.00390625 と、一致しないのが気になりますが、きっとどこかで何らかの計算がおこなわれて差異が発生したんでしょう、きっと。
1) を前回のコードに取り入れて、それぞれの数値をいろいろ変えてみたのが、以下のサンプルです。
SPRITE は DEFAULT_SPRITE_ALPHA、FILL は DEFAULT_FILL_ALPHA です。
- SPRITE:1 FILL:1
- SPRITE:1
- FILL:1
- SPRITE:0.5 FILL:0.5
- SPRITE:0.5 FILL:0.1
- SPRITE:0.1 FILL:0.5
サンプル1で "sprite" の正体が分かりました。
"sprite" は対象 DisplayObject3D の上位深度に生成される、単色で塗りつぶされた Sprite オブジェクトだったのですね。
camera3D によってレンダリングされた DisplayObject3D の形態のみを写し取るもので、MovieScene3D 使用時の DisplayObject3D.container みたいにスキンまでは写し取らないものだったようです。
これらのサンプル群と、org.papervision3d.utils.InteractiveContainerData.as、org.papervision3d.utils.InteractiveSceneManager.as を見るに、どうやらこの "sprite" に関わる DEFAULT_FILL_ALPHA と DEFAULT_SPRITE_ALPHA の二つの変数は、以下のようなものらしい。
- DEFAULT_FILL_ALPHA
- "sprite" を塗りつぶす際の beginFill の引数となるアルファ値
- DEFAULT_SPRITE_ALPHA
- "sprite" そのもののアルファ値
個人的には、どっちか一つで充分な気もしないでもないですが。
ただ、分からないのはサンプル2-a、2-b、3-a、3-b、4 です。
2-b や 3-b が分かりやすいのですが、なぜ Plane が半透明に見えるのかが理解できません。
DisplayObject3D 生成時にマテリアルが半透明に beginFill でもされるんでしょうか。
だったら 2-c や 3-c、5、6 の Plane はもっと透明度が高くなり、2-d や 3-d は不可視化してもよさそうなものなんですが。
この "sprite" のアルファ値と DisplayObject3D の関係がいまいちよく分かりません。
ただ、公式サンプルで使っていたフィルターがなぜグローなのかはこれで分かりました。
DisplayObject3D の姿にではなく、単色 Sprite に対してフィルターをかけるんだったら、グローしか選択肢はないよなぁ。
どうも、InteractiveScene3D は、階層構造を持った DisplayObject3D にマウスイベントを付加することが目的の scene であり、このグローフィルター適用というのはあくまでも副産物、InteractiveScene3DEvent.sprite は表示物としては使い道がない、という認識でいた方が無難らしい。
それにこのエントリーの冒頭でも触れましたが、マウスイベント発生時でしか取得できない "sprite" では、自分的にはつぶしが利かな過ぎる。
フォグ効果については、別な手段を講じないとダメですなー。