PV3DTest16 :カメラが操作オブジェクトの周りを360度回転できるように変更
3D用カメラが操作オブジェクトの周りを360度回転できるように変更
AまたはDボタンでカメラの位置を操作オブジェクトを中心に4度づつ回転させます
★★★ 操作オブジェクトについて :★★★★★★★★★★★★★★★★★★★★★
←↑→↓ボタンで操作オブジェクトを移動させます
← →で方向決定、↑で前進、↓で後退
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★★★ 移動状態について :★★★★★★★★★★★★★★★★★★★★★★★★
移動すると手足を動かします
Bボタン押しながら前進・後退で移動速度3倍(手足を動かす速さは変わらず。。。)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★★★ カメラについて :★★★★★★★★★★★★★★★★★★★★★★★★★★
W、Sボタンでカメラ位置を上下に変更(カメラのX軸回転を行います)
A、Dボタンで操作オブジェクトを中心にカメラが回転します(カメラのY軸回転を行います)
Aで移動オブジェクトを中心にして左回転、Dでは右回転します
Fボタンで移動オブジェクトからのカメラの距離が変わります
Rボタンでデフォルトのカメラ設定にもどる(と思います。。。)
カメラが操作オブジェクトに合わせて移動、視点も操作オブジェクトに合わせます
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
/**
* Copyright siouxcitizen ( http://wonderfl.net/user/siouxcitizen )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/8Q8A
*/
// forked from hacker_7daxapax's PV3DTest15 :オブジェクト指向でRGB三兄弟
//3D用カメラが操作オブジェクトの周りを360度回転できるように変更
//AまたはDボタンでカメラの位置を操作オブジェクトを中心に4度づつ回転させます
//★★★ 操作オブジェクトについて :★★★★★★★★★★★★★★★★★★★★★
//←↑→↓ボタンで操作オブジェクトを移動させます
//← →で方向決定、↑で前進、↓で後退
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//★★★ 移動状態について :★★★★★★★★★★★★★★★★★★★★★★★★
//移動すると手足を動かします
//Bボタン押しながら前進・後退で移動速度3倍(手足を動かす速さは変わらず。。。)
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//★★★ カメラについて :★★★★★★★★★★★★★★★★★★★★★★★★★★
//W、Sボタンでカメラ位置を上下に変更(カメラのX軸回転を行います)
//A、Dボタンで操作オブジェクトを中心にカメラが回転します(カメラのY軸回転を行います)
//Aで移動オブジェクトを中心にして左回転、Dでは右回転します
//Fボタンで移動オブジェクトからのカメラの距離が変わります
//Rボタンでデフォルトのカメラ設定にもどる(と思います。。。)
//カメラが操作オブジェクトに合わせて移動、視点も操作オブジェクトに合わせます
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.objects.DisplayObject3D;
[SWF(width="500", height="500", frameRate="60", backgroundColor="#111111")]
public class MovieFigure extends Sprite
{
private var container : Sprite;
private var viewport : Viewport3D;
private var scene : Scene3D;
private var camera : Camera3D;
private var wireFramMate : WireframeMaterial;
private var planeObj : Plane;
private var renderer : BasicRenderEngine;
private var planeSize : int = 2000; //Planeオブジェクト1辺の長さ
private var cameraPitch: int = 90; //カメラのX軸回転の値
private var cameraYaw : int = 270; //カメラのY軸回転の値
private var distStat: int = 1; //カメラ設置場所の距離種類 0~2
private var figure00 : Figure; //人型オブジェクトその1 カメラ視点の基準となる
private var figure01 : Figure; //人型オブジェクトその2
private var figure02 : Figure; //人型オブジェクトその3
//MovieFigureクラスのコンストラクタ
public function MovieFigure():void
{
//ビューポート生成
viewport = new Viewport3D(stage.stageWidth, stage.stageHeight);
addChild(viewport);
//シーン生成
scene = new Scene3D();
//レンダリングエンジン生成
renderer = new BasicRenderEngine();
//Planeオブジェクト用ワイヤーフレームマテリアル設定
wireFramMate = new WireframeMaterial(0x0000FF);
//Planeオブジェクト生成
planeObj= new Plane(wireFramMate, planeSize, planeSize, 4, 4);
planeObj.rotationX = 90;
scene.addChild(planeObj);
//Figureオブジェクト生成 3体量産(RGB三兄弟)
figure00 = new Figure(new MaterialsList({all:new ColorMaterial(0x00AA00)}),
new ColorMaterial(0x00FF00),
0,230,0);
scene.addChild(figure00.body);
figure01 = new Figure(new MaterialsList({all:new ColorMaterial(0x0000FF)}),
new ColorMaterial(0x00AAFF),
300,230,300);
scene.addChild(figure01.body);
figure02 = new Figure(new MaterialsList({all:new ColorMaterial(0xFF0000)}),
new ColorMaterial(0xFF7700),
-300,230,-300);
scene.addChild(figure02.body);
//カメラ設定
camera = new Camera3D();
camera.y = 200;
camera.target = DisplayObject3D.ZERO;
//イベント処理用リスナを設定
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
}
//フレーム毎の処理
private function onEnterFrame(e:Event):void{
figure00.draw();
figure01.draw();
figure02.draw();
//カメラ視点設定
setCamera();
renderer.renderScene(scene, camera, viewport);
}
//カメラ視点設定
private function setCamera():void{
var cameraDist : int = -1000; //デフォルトの距離、ステータスは1
if (distStat == 0) {
cameraDist = -500;
} else if (distStat == 1) {
cameraDist = -1000;
} else if (distStat == 2) {
cameraDist = -1500;
}
//camera.x=-1000*Math.cos((90-body.rotationY)*Math.PI/180)+body.x;
//camera.z=-1000*Math.sin((90-body.rotationY)*Math.PI/180)+body.z;
camera.x=cameraDist*Math.cos((90-figure00.body.rotationY)*Math.PI/180)+figure00.body.x;
camera.z=cameraDist*Math.sin((90-figure00.body.rotationY)*Math.PI/180)+figure00.body.z;
camera.target.x=figure00.body.x;
camera.target.y=figure00.body.y;
camera.target.z=figure00.body.z;
camera.orbit(cameraPitch, cameraYaw, true, figure00.body);
}
//キーボードを押したときの処理
//←↑→↓ボタン押下時処理(操作オブジェクト移動のための設定)
//A、D、W、Sボタン押下時処理(カメラ視点変更処理)
//F、Rボタン処理 F:カメラ距離変更 R:カメラ設定デフォルト
//Bボタン処理 Bダッシュを行う
private function onKeyDown(event:KeyboardEvent):void{
//←ボタンDOWN 左回転の設定
if (event.keyCode == 37) {
figure00.leftButtonActioin();
figure01.leftButtonActioin();
figure02.leftButtonActioin();
//→ボタンDOWN 右回転の設定
} else if (event.keyCode == 39) {
figure00.rightButtonActioin();
figure01.rightButtonActioin();
figure02.rightButtonActioin();
//↑ボタンDOWN 前進の設定
} else if (event.keyCode == 38) {
figure00.upButtonActioin();
figure01.upButtonActioin();
figure02.upButtonActioin();
//↓ボタンDOWN 後退の設定
} else if (event.keyCode == 40) {
figure00.downButtonActioin();
figure01.downButtonActioin();
figure02.downButtonActioin();
//Bボタン Bボタン押下中は前進・後退中の移動速度3倍
} else if (event.keyCode == 66) {
figure00.bButtonActioin();
figure01.bButtonActioin();
figure02.bButtonActioin();
//Aボタン 操作オブジェクトを中心にカメラを左回り回転(Y軸回転)
//4度づつ左回り回転
} else if (event.keyCode == 65) {
cameraYaw = cameraYaw - 4;
if(cameraYaw < 0) {cameraYaw = 360;}
//Dボタン 操作オブジェクトを中心にカメラを右回り回転(Y軸回転)
//4度づつ右回り回転
} else if (event.keyCode == 68) {
cameraYaw = cameraYaw + 4;
if(cameraYaw > 360) {cameraYaw = 0;}
//Wボタン 操作オブジェクトを中心にカメラを上下移動(X軸回転)
} else if (event.keyCode == 87) {
if(cameraPitch > 50) {cameraPitch = cameraPitch - 10;}
//Sボタン 操作オブジェクトを中心にカメラを上下移動(X軸回転)
} else if (event.keyCode == 83) {
if(cameraPitch < 100) {cameraPitch = cameraPitch + 10;}
//Fボタン カメラと操作オブジェクトの距離を変更
} else if (event.keyCode == 70) {
distStat -= 1;
if(distStat < 0) {distStat = 2;}
//Rボタン カメラの設定をデフォルトにもどす
} else if (event.keyCode == 82) {
distStat = 1;
cameraPitch = 90; //カメラのX軸回転の値
cameraYaw = 270; //カメラのY軸回転の値
}
}
//キーボードを離したときの処理
//←↑→↓ボタンリリース時処理(操作オブジェクト移動のための設定解除)
private function onKeyUp(event:KeyboardEvent):void{
//←ボタンUP 左回転の設定設定解除
if (event.keyCode == 37) {
figure00.leftButtonRelease();
figure01.leftButtonRelease();
figure02.leftButtonRelease();
//→ボタンUP 右回転の設定設定解除
} else if (event.keyCode == 39) {
figure00.rightButtonRelease();
figure01.rightButtonRelease();
figure02.rightButtonRelease();
//↑ボタンUP 前進の設定設定解除
} else if (event.keyCode == 38) {
figure00.upButtonRelease();
figure01.upButtonRelease();
figure02.upButtonRelease();
//↓ボタンUP 後退の設定設定解除
} else if (event.keyCode == 40) {
figure00.downButtonRelease();
figure01.downButtonRelease();
figure02.downButtonRelease();
//BボタンUP Bダッシュ解除
} else if (event.keyCode == 66) {
figure00.bButtonRelease();
figure01.bButtonRelease();
figure02.bButtonRelease();
}
}
}
}
import flash.display.Sprite;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.objects.primitives.Cylinder;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.materials.utils.MaterialsList;
class Figure extends Sprite
{
public var body : Cube; //胴体部
private var head : Sphere; //頭部
private var leftHand : Cylinder; //画面向かって左側手
private var rightHand : Cylinder; //画面向かって右側手
private var leftFoot : Cylinder; //画面向かって左側足
private var rightFoot : Cylinder; //画面向かって右側足
private var materials : MaterialsList;
private var status : int = 0; //操作オブジェクトの表示制御用ステータス
private var rotat : Boolean = false; //Y軸回転判定
private var rotatNum : int = 0; //Y軸回転角度
private var wardMove : Boolean = false; //前進後退判定
private var wardMoveNum : int = 0; //前進後退速度
private var bDash : Boolean = false; //Bダッシュ判定
private var walkDispInterval : int = 0; //歩行表示間隔カウンター
private const INTERVAL: int = 24; //歩行表示間隔
public function Figure(colMateListForHead:MaterialsList,
colMateForLimbs:ColorMaterial,
x:int=0,y:int=230,z:int=0):void {
//操作用人型オブジェクトを作成
//胴体部オブジェクトを親として頭部・手足を子オブジェクトとして加えていく
//胴体部をCubeオブジェクトで作成
body = new Cube(colMateListForHead, 150, 100, 160);
body.x = x;
body.y = y;
body.z = z;
//頭部をSphereでオブジェクト作成
head = new Sphere(colMateForLimbs, 65, 8, 6);
head.y = 150;
body.addChild(head);
//Cylinderオブジェクトで手足を作成
//画面向かって左側の手をCylinderオブジェクトで生成
leftHand = new Cylinder(colMateForLimbs,20,130);
leftHand.x = -110;
leftHand.y = 10;
body.addChild(leftHand);
//画面向かって右側の手をCylinderオブジェクトで生成
rightHand = new Cylinder(colMateForLimbs,20,130);
rightHand.x = 110;
rightHand.y = 10;
body.addChild(rightHand);
//画面向かって左側の足をCylinderオブジェクトで生成
leftFoot = new Cylinder(colMateForLimbs,30,130);
leftFoot.x = -50;
leftFoot.y = -160;
body.addChild(leftFoot);
//画面向かって右側の足をCylinderオブジェクトで生成
rightFoot = new Cylinder(colMateForLimbs,30,130);
rightFoot.x = 50;
rightFoot.y = -160;
body.addChild(rightFoot);
}
//←ボタン押下時処理
public function leftButtonActioin():void {
rotat = true;
rotatNum = -5;
//操作ボタン押下時の値:1を設定
if(walkDispInterval < 1) {
walkDispInterval = 1;
}
}//←ボタンリリース時処理
public function leftButtonRelease():void {
rotat = false;
//操作ボタンリリース時の値:0を設定 他の操作ボタン押下中には設定しない
if(!rotat && !wardMove) {
walkDispInterval = 0;
}
}
//→ボタン押下時処理
public function rightButtonActioin():void {
rotat = true;
rotatNum = 5;
if(walkDispInterval < 1) {
walkDispInterval = 1;
}
}//→ボタンリリース時処理
public function rightButtonRelease():void {
rotat = false;
if(!rotat && !wardMove) {
walkDispInterval = 0;
}
}
//↑ボタン押下時処理
public function upButtonActioin():void {
wardMove = true;
wardMoveNum = 10;
if(walkDispInterval < 1) {
walkDispInterval = 1;
}
}//↑ボタンリリース時処理
public function upButtonRelease():void {
wardMove = false;
if(!rotat && !wardMove) {
walkDispInterval = 0;
}
}
//↓ボタン押下時処理
public function downButtonActioin():void {
wardMove = true;
wardMoveNum = -5;
if(walkDispInterval < 1) {
walkDispInterval = 1;
}
}//↓ボタンリリース時処理
public function downButtonRelease():void {
wardMove = false;
if(!rotat && !wardMove) {
walkDispInterval = 0;
}
}
//Bボタン押下時処理
public function bButtonActioin():void {
bDash = true;
}//Bボタンリリース時処理
public function bButtonRelease():void {
bDash = false;
}
//捜査対象オブジェクトの手足表示を制御
private function ctrlWaklDisp():void{
//status:操作オブジェクトの表示制御用ステータス
//0:直立
//1:左手、右足前方&右手、左足後方
//2:左手、右足後方&右手、左足前方
//前進・後退時は1と2の状態を交互に繰り返す
//直立状態(0)からは(1)の状態へ遷移
if (status == 0) {status = 1;}
//(1)の状態をセット後、ステータスを(2)に変更
if (status == 1) {
//左手、右足前方
leftHand.z = 70;
leftHand.rotationX = -40;
rightFoot.z = 50;
rightFoot.rotationX = -30;
//右手、左足後方
rightHand.z = -70;
rightHand.rotationX = 40;
leftFoot.z = -50;
leftFoot.rotationX = 30;
status = 2;
//(2)の状態をセット後、ステータスを(1)に変更
} else if (status == 2) {
//左手、右足後方
leftHand.z = -70;
leftHand.rotationX = 40;
rightFoot.z = -50;
rightFoot.rotationX = 30;
//右手、左足前方
rightHand.z = 70;
rightHand.rotationX = -40;
leftFoot.z = 50;
leftFoot.rotationX = -30;
status = 1;
}
}
public function draw():void {
//← →ボタンが押され続けている間、操作オブジェクトを回転させる
if (rotat) {
body.rotationY += rotatNum;
}
//↑ ↓ボタンが押され続けている間、操作オブジェクトを前進・後退させる
if (wardMove) {
//Bボタンが押されていないときの前進・後退は通常の移動速度
if (!bDash) {
body.moveForward(wardMoveNum);
//Bボタンが押されているときの前進・後退は通常の3倍速
} else {
body.moveForward(wardMoveNum*3);
}
}
//walkDispInterval:
//操作ボタン押下時は1の値、
//操作ボタン押下継続中は1以上の値、
//操作ボタンリリース時は0を設定
//操作ボタンの最初の押下時の歩行表示を行う
if(walkDispInterval == 1) {
//歩行表示
ctrlWaklDisp();
}
//操作ボタン押下継続の間、指定した間隔で歩行表示
if((rotat || wardMove) && walkDispInterval >= 1) {
//いずれかの操作ボタン押下継続時に歩行表示カウンタをカウントアップ
walkDispInterval++;
//指定したインターバルを経過時に歩行表時
if(walkDispInterval > INTERVAL) {
//歩行表示
ctrlWaklDisp();
//歩行表示カウンタを2にもどす(1にもどした場合上記の最初の押下時処理を必ず通り表示がおかしくなるため)
walkDispInterval = 2;
}
}
}
}