package {
import flash.display.*;
import flash.text.*;
import flash.events.*;
import flash.utils.getTimer;
import flash.geom.Rectangle;
import org.papervision3d.view.*;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.materials.*;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.*;
import org.papervision3d.objects.primitives.*;
import org.papervision3d.events.*;
import org.papervision3d.materials.special.CompositeMaterial;
import org.papervision3d.core.utils.*;
import org.papervision3d.core.utils.virtualmouse.VirtualMouse;
import caurina.transitions.*;
public class Main extends Sprite
{
private var viewport:Viewport3D;
private var camera:Camera3D;
private var scene:Scene3D;
private var renderer:BasicRenderEngine;
private var myCube:Cube;
private var plane:Plane;
public var mouse3D :Mouse3D;
public var vMouse :VirtualMouse;
public function Main()
{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.quality = StageQuality.HIGH;
//PV3D初期設定
init3D();
//3Dオブジェクト追加
init3D_Obj();
//フレームレート表示設定
iniFpsDisp();
//キーイベントを追加
stage.addEventListener(KeyboardEvent.KEY_DOWN,evKeyDown);
//マウスイベントを追加
stage.addEventListener(MouseEvent.MOUSE_DOWN,evMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP,evMouseUp);
stage.addEventListener(MouseEvent.MOUSE_MOVE,evMouseMove);
//毎フレーム処理
addEventListener(Event.ENTER_FRAME,handler );
}
//毎フレーム処理
private function handler(event:Event):void
{
//フレームレートを表示
disFps();
//3Dレンダリング
renderer.renderScene( scene , camera, viewport );
}
//====================■フレームレート表示■====================
private var oldTimer:Number = getTimer();
private var dispFps = new TextField;
private var myBitmapData:BitmapData
private var base:Sprite=new Sprite();
private var line:Shape=new Shape();
//フレームレート表示設定
private function iniFpsDisp():void
{
myBitmapData = new BitmapData(60, 3, false, 0x000000);
var myBitmapImage:Bitmap = new Bitmap(myBitmapData,"auto",true);
myBitmapImage.x = 3;
myBitmapImage.y = 18;
stage.addChild(myBitmapImage);
dispFps.textColor = 0xEEEEEE;
addChild(dispFps);
}
//フレームレート情報を表示
private function disFps():void
{
// 1フレームにかかった時間からfpsを計測
var fps:Number = 1 / ((getTimer() - oldTimer) / 1000);
// 小数点第1位に丸めてトレース
oldTimer = getTimer();
dispFps.text = "fps : " + (Math.round( fps )) + "/" + stage.frameRate;
var rect : Rectangle = new Rectangle(0, 0, 60, 5);
myBitmapData.fillRect(rect , 0x00000000);
var line:Shape=new Shape();
line.graphics.lineStyle(3,0xff0000);//線幅・線色
line.graphics.moveTo(0,1);//始点のXY座標
line.graphics.lineTo((fps / stage.frameRate) * 60 ,1);//終点のXY座標
myBitmapData.draw(line);
}
//====================□フレームレート表示□====================
//papervision3d初期設定
private function init3D():void
{
viewport = new Viewport3D(550,400,true,true);
viewport.opaqueBackground = 0x000000;
//インタラクティブオブジェクトをオーバーした時にカーソルを指カーソルにする
viewport.containerSprite.buttonMode = true;
//vMouseに座標を取れるようにする
vMouse = viewport.interactiveSceneManager.virtualMouse;
mouse3D = viewport.interactiveSceneManager.mouse3D;
Mouse3D.enabled = true;
addChild(viewport);
renderer = new BasicRenderEngine();
camera = new Camera3D();
camera.x = 0;
camera.y = 0;
camera.z = -300;
//camera.focus = 8.660254037844389;
//camera.zoom = 40;
scene = new Scene3D();
}
var compoMat_r:CompositeMaterial = new CompositeMaterial();
//papervision3d初期設定
function init3D_Obj():void
{
//マテリアルを作成
var mc_one:MovieAssetMaterial =new MovieAssetMaterial( "one" );
var mc_two:MovieAssetMaterial =new MovieAssetMaterial( "two" );
var mc_three:MovieAssetMaterial =new MovieAssetMaterial( "three" );
var mc_four:MovieAssetMaterial =new MovieAssetMaterial( "four" );
var mc_five:MovieAssetMaterial =new MovieAssetMaterial( "five" );
var mc_six:MovieAssetMaterial =new MovieAssetMaterial( "six" );
mc_one.doubleSided = false;
mc_two.doubleSided = false;
mc_three.doubleSided = false;
mc_four.doubleSided = false;
mc_five.doubleSided = false;
mc_six.doubleSided = false;
//interactiveをtrueにするのを忘れずに
mc_one.interactive = true;
mc_two.interactive = true;
mc_three.interactive = true;
mc_four.interactive = true;
mc_five.interactive = true;
mc_six.interactive = true;
//マテリアルに対してのイベントは無効?
//マテリアルリストを作成
var mList : MaterialsList = new MaterialsList( {
front : mc_one ,
back : mc_two ,
right : mc_three ,
left : mc_four,
top : mc_five ,
bottom : mc_six
} );
//立方体オブジェクトを作成
myCube = new Cube(mList,100,100,100,8,8,8);
myCube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, myCubeClick);
//myCube.addEventListener(InteractiveScene3DEvent.OBJECT_MOVE, myCubeMove);
//オブジェクトを追加
scene.addChild( myCube );
myCube.rotationY = 2000;
myCube.rotationX = 200;
myCube.rotationZ = 200;
Tweener.addTween(myCube,{
rotationX: 0,
rotationY: 180,
rotationZ: 0,
time:2,
onComplete:nextAction
});
}
function myCubeClick(e:InteractiveScene3DEvent):void{
trace(e);
//「1」がクリックされた時
if(vMouse.container.name == "instance6"){
Tweener.addTween(myCube,{
rotationX: 0,
rotationY: 0,
rotationZ: 0,
time:1,
onComplete:nextAction
});
//「2」がクリックされた時
}else if(vMouse.container.name == "instance9"){
Tweener.addTween(myCube,{
rotationX: 0,
rotationY: 90,
rotationZ: 0,
time:1,
onComplete:nextAction
});
//「3」がクリックされた時
}else if(vMouse.container.name == "instance12"){
Tweener.addTween(myCube,{
rotationX: 0,
rotationY: 270,
rotationZ: 0,
time:1,
onComplete:nextAction
});
//「4」がクリックされた時
}else if(vMouse.container.name == "instance15"){
Tweener.addTween(myCube,{
rotationX: 270,
rotationY: 0,
rotationZ: 0,
time:1,
onComplete:nextAction
});
//「5」がクリックされた時
}else if(vMouse.container.name == "instance18"){
Tweener.addTween(myCube,{
rotationX: 270,
rotationY: 180,
rotationZ: 0,
time:1,
onComplete:nextAction
});
//「6」がクリックされた時
}else if(vMouse.container.name == "instance21"){
Tweener.addTween(myCube,{
rotationX: 0,
rotationY: 180,
rotationZ: 0,
time:1,
onComplete:nextAction
});
}else{
trace("×");
}
}
function myCubeMove(e):void{
//trace(e);
}
function nextAction():void{
stage.quality = StageQuality.HIGH;
}
var xPos:Number = 0;
var yPos:Number = 0;
var eFlg:Boolean = false;
var kFlg:Boolean = false;
//キー入力イベントを作成
function evKeyDown(event:KeyboardEvent){
switch(event.keyCode){
case 32: //spaceが押された
if(kFlg){
kFlg = false;
}else{
kFlg = true;
}
break;
}
trace(event.keyCode);
}
//マウスダウン処理
function evMouseDown(event:MouseEvent):void{
eFlg = true;
compoMat_r.interactive = false;
trace(vMouse.container.name);
trace(vMouse.container);
trace(myCube.rotationX + "@" + myCube.rotationY + "@" +
myCube.rotationZ);
//stage.quality = StageQuality.LOW;
}
//マウスアップ処理
function evMouseUp(event:MouseEvent):void{
compoMat_r.interactive = true;
eFlg = false;
}
//マウスムーブ処理
function evMouseMove(event:MouseEvent):void{
if(eFlg){
Tweener.addTween(myCube,{
rotationY: myCube.rotationY - (mouseX - xPos) * 5,
time:1,
onComplete:nextAction
});
if(kFlg){
//Zモード
Tweener.addTween(myCube,{
rotationZ: myCube.rotationZ - (mouseY - yPos) * 5,
time:1,
onComplete:nextAction
});
}else{
//Xモード
Tweener.addTween(myCube,{
rotationX: myCube.rotationX - (mouseY - yPos) * 5,
time:1,
onComplete:nextAction
});
}
}
xPos = mouseX;
yPos = mouseY;
}
}
}