2009年5月19日火曜日

PeparVision3d アルファを設定

ブックマークしてたブログが消えてるー!!!
google大先生のキャッシュからコピペ。
ポイントは
_xxxxx.useOwnContainer = true;
しかし、CLICKが効かなくなる様子。注意。

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

前回のデータにマウスオーバー時の効果をつけてみます。
今回はオーバー時に透明度を少し下げる効果です。
もちろんアウト時に元に戻しておきます。

サンプル
JavascriptをONにし、最新のFlashプレーヤーをインストールしてください。

ドキュメントクラス

package
{
import flash.display.BitmapData;
import flash.events.Event;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.view.BasicView;
public class Main extends BasicView
{
private var _plane:Plane;
public function Main():void
{
super(0, 0, true, true);
viewport.buttonMode = true;
var bmd:BitmapData=new Img(180,180)
var bm:BitmapMaterial = new BitmapMaterial(bmd);
bm.doubleSided = true;
bm.smooth = true;
bm.interactive = true;
_plane = new Plane(bm, 300, 300, 3, 3);
_plane.useOwnContainer = true;
_plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, pressHandler);
_plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, overHandler);
_plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, outHandler);
scene.addChild(_plane);
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
startRendering();
}
private function enterFrameHandler(e:Event):void{
_plane.rotationX = stage.mouseY - stage.stageHeight * 0.5;
_plane.rotationY = stage.mouseX - stage.stageWidth * 0.5;
}
private function pressHandler(e:InteractiveScene3DEvent):void
{
_plane.scaleX *= 1.1;
_plane.scaleY *= 1.1;
}
private function outHandler(e:InteractiveScene3DEvent):void
{
_plane.alpha = 1.0;
}
private function overHandler(e:InteractiveScene3DEvent):void
{
_plane.alpha = 0.5;
}
}
}

何箇所か追加・変更をしたので順番にいきます。

22行目:オブジェクトにフィルタをかけたり、アルファを変更したりできるようになります。

_plane.useOwnContainer = true;

ただし、下記のマウスイベントを取得できなくなってしまいます。

InteractiveScene3DEvent.OBJECT_CLICK
InteractiveScene3DEvent.OBJECT_DOUBLE_CLICK

これに関しては色々な人が不便さを訴えているようですね。
バグっぽいっていう話もあったりなかったり・・・。

23行目:上に書いたとおりイベントを受け取らなくなってしまうので
受け取るイベントの種類を「click」→「press」に変更しました。

_plane.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, pressHandler);

24行目:マウスオーバー時のイベントリスナー

_plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, overHandler);

25行目:マウスアウト時のイベントリスナー

_plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, overHandler);

39~46行目:マウスオーバー・アウト時のイベントハンドラー

変更箇所を全部書いたのでややこしくなってしまいましたが
一番重要なのはuseOwnContainer。

alpha値を変更するにはこれをtrueにしておく必要があるのは
知らないとつまづいて長時間悩んでしまうところかもしれないです。