2008年 04月 22日
今度はカメラが付いてくるようにします。
package {
import flash.display.Sprite;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.primitives.Plane;
import flash.events.Event;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.core.utils.Mouse3D;
import flash.display.BitmapData;
import flash.utils.getDefinitionByName;
import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.materials.BitmapMaterial;
import org.papervision3d.lights.PointLight3D;
import org.papervision3d.materials.shadematerials.PhongMaterial;
import org.papervision3d.materials.shadematerials.GouraudMaterial;
import org.papervision3d.materials.shadematerials.CellMaterial;
import org.papervision3d.materials.shadematerials.EnvMapMaterial;
import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
import org.papervision3d.objects.parsers.Collada;
import org.papervision3d.objects.DisplayObject3D;
import flash.display.Bitmap;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.events.RendererEvent;
import org.papervision3d.events.AnimationEvent;
import org.papervision3d.events.FileLoadEvent;
import org.papervision3d.materials.shaders.PhongShader;
import org.papervision3d.materials.shaders.ShadedMaterial;
import org.papervision3d.materials.WireframeMaterial;
import flash.display.StageQuality;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import org.papervision3d.objects.primitives.Cone;
[SWF(width="600",height="400",frameRate="30",backgroundColor="#CCCCCC")]
public class game_car_2 extends Sprite
{
public var viewport :Viewport3D;
public var scene :Scene3D;
public var camera :Camera3D;
public var renderer :BasicRenderEngine;
public var model :DisplayObject3D;
public var Steer_FL :DisplayObject3D;
public var Steer_FR :DisplayObject3D;
public var Wheel_FR :DisplayObject3D;
public var Wheel_FL :DisplayObject3D;
public var Wheel_RR :DisplayObject3D;
public var Wheel_RL :DisplayObject3D;
public var test_model :DisplayObject3D;
/*----------------------------------------
コントローラー用メンバ変数
----------------------------------------*/
public var keyForward:Boolean; //アクセルフラグ
public var keyReverse:Boolean; //バックフラグ
public var keyLeft:Boolean; //ハンドル左フラグ
public var keyRight:Boolean; //ハンドル右フラグ
public var speed:Number = 0; //現在の速度
public var topSpeed:Number = 0; //指定する速度
public var steer:Number = 0; //現在のハンドル角度
public var topSteer:Number = 0; //指定するハンドル角度
/*----------------------------------------
ソースを組み込む
----------------------------------------*/
[Embed(source="./data/Focus.dae", mimeType="application/octet-stream")]
private var collada_car:Class;
[Embed(source="./data/image/body.jpg")]
private var body_texture:Class;
[Embed(source="./data/image/wheel.jpg")]
private var wheel_texture:Class;
/**----------------------------------------------------------------------
* コンストラクタ
-----------------------------------------------------------------------*/
public function game_car_2() {
//画質を低に
this.stage.quality = StageQuality.LOW;
//初期化
init();
}
/**----------------------------------------------------------------------
* init
* 初期化
-----------------------------------------------------------------------*/
public function init():void {
//このムービーのスケールモードを設定
this.stage.scaleMode = "noScale"
this.stage.align = "left";
//3Dの初期設定
this.init3D();
//キーボードをセットアップ
this.stage.addEventListener( KeyboardEvent.KEY_DOWN, this.keyDownHandler );
this.stage.addEventListener( KeyboardEvent.KEY_UP, this.keyUpHandler );
//毎フレーム呼び出されるイベントを追加
this.addEventListener( Event.ENTER_FRAME, this.loop_Proc );
}
/**----------------------------------------------------------------------
* init3D
* 3Dの初期設定
-----------------------------------------------------------------------*/
public function init3D():void {
// ビューポートの作成
this.viewport = new Viewport3D(0, 0, true, true);
this.addChild( viewport );
//レンダラーの設定
this.renderer = new BasicRenderEngine();
//シーン作成
this.scene = new Scene3D();
//ライトの作成
var light:PointLight3D = new PointLight3D();
light.x = 100;
light.y = 10000;
light.z = -1000;
//ライトを追加
this.scene.addChild(light);
//テクスチャー
var body_tex:Bitmap = new body_texture() as Bitmap;
var body_bit_mat:BitmapMaterial = new BitmapMaterial(body_tex.bitmapData);
var phong_shader:PhongShader = new PhongShader(light ,0xFFFFFF , 0x444444,1);
//マテリアルリスト
var body_mat_list:MaterialsList = new MaterialsList(
{all:new ShadedMaterial(body_bit_mat,phong_shader)}
);
//collada から モデルを作成
this.model = new Collada(XML(new collada_car()),body_mat_list).getChildByName("Focus");
//モデルをシーンに追加
this.scene.addChild(this.model);
//ホイルのマテリアルを作成
var wheel_tex:Bitmap = new wheel_texture() as Bitmap;
var wheel_mat:BitmapMaterial = new BitmapMaterial(wheel_tex.bitmapData);
var wheel_sh_mat:ShadedMaterial = new ShadedMaterial(wheel_mat,phong_shader);
//パーツを取得
this.Steer_FL = this.model.getChildByName("Steer_FL");
this.Steer_FR = this.model.getChildByName("Steer_FR");
this.Wheel_FL = this.Steer_FL.getChildByName("Wheel_FL");
this.Wheel_FR = this.Steer_FR.getChildByName("Wheel_FR");
this.Wheel_RL = this.model.getChildByName("Wheel_RL");
this.Wheel_RR = this.model.getChildByName("Wheel_RR");
//ホイルのマテリアル設定
this.Wheel_RL.material = wheel_sh_mat;
this.Wheel_RR.material = wheel_sh_mat;
this.Wheel_FL.material = wheel_sh_mat;
this.Wheel_FR.material = wheel_sh_mat;
//地面を作成
var plane:Plane = new Plane(new WireframeMaterial(0x000000),100000,100000,20,20);
plane.rotationX = -90;
plane.y = -70;
this.scene.addChild(plane);
// カメラの作成
this.camera = new Camera3D();
this.camera.z = -4000;
this.camera.zoom = 5;
this.camera.y = 2000;
this.camera.target = this.model;
//this.camera.lookAt(this.model);
this.test_model = new Cone(null,100,500);
this.scene.addChild(this.test_model);
}
/**----------------------------------------------------------------------
* keyDownHandler
-----------------------------------------------------------------------*/
private function keyDownHandler( event :KeyboardEvent ):void
{
switch( event.keyCode )
{
case "W".charCodeAt():
case Keyboard.UP:
this.keyForward = true;
this.keyReverse = false;
break;
case "S".charCodeAt():
case Keyboard.DOWN:
this.keyReverse = true;
this.keyForward = false;
break;
case "A".charCodeAt():
case Keyboard.LEFT:
this.keyLeft = true;
this.keyRight = false;
break;
case "D".charCodeAt():
case Keyboard.RIGHT:
this.keyRight = true;
this.keyLeft = false;
break;
}
//trace("keyDownHandler: " + event.keyCode);
}
/**----------------------------------------------------------------------
* keyUpHandler
-----------------------------------------------------------------------*/
private function keyUpHandler( event :KeyboardEvent ):void
{
switch( event.keyCode )
{
case "W".charCodeAt():
case Keyboard.UP:
this.keyForward = false;
break;
case "S".charCodeAt():
case Keyboard.DOWN:
this.keyReverse = false;
break;
case "A".charCodeAt():
case Keyboard.LEFT:
this.keyLeft = false;
break;
case "D".charCodeAt():
case Keyboard.RIGHT:
this.keyRight = false;
break;
}
//trace("keyUpHandler: " + event.keyCode);
}
/**----------------------------------------------------------------------
* driveCar
-----------------------------------------------------------------------*/
private function driveCar():void
{
/* ---- アクセルの処理 ---- */
//前進
if( this.keyForward )
{
this.topSpeed = 600;
}
//バック
else if( this.keyReverse )
{
this.topSpeed = -50;
}
else
{
//何もしないときはアクセルをゼロに
this.topSpeed = 0;
}
//現在のスピードをトップスピードに徐々に近づける
this.speed -= ( this.speed - this.topSpeed ) / 100;
/* ---- ハンドルを切る処理 ---- */
//右に曲がる
if( this.keyRight )
{
//20度まで曲がる
if( this.topSteer < 20 )
{
this.topSteer += 5;
}
this.speed += ( 0 - this.speed ) * 0.01;
}
//左に曲がる
else if( this.keyLeft )
{
//-20度までに曲がる
if( this.topSteer > -20 )
{
this.topSteer -= 5;
}
this.speed += ( 0 - this.speed ) * 0.01;
}
else
{
//何もしない時はゼロに近づいていく
this.topSteer -= this.topSteer / 5;
}
//指定の角度まで徐々に近づく
this.steer -= ( this.steer - this.topSteer ) / 2;
/* ---- 車のアニメーション ---- */
//前タイヤを回転(ハンドルを切る)
this.Steer_FR.rotationY = this.steer;
this.Steer_FL.rotationY = this.steer;
//タイヤの回転
var roll :Number = speed/2;
this.Wheel_FR.roll( roll );
this.Wheel_RR.roll( roll );
this.Wheel_FL.roll( -roll );
this.Wheel_RL.roll( -roll );
// 車を回転させる
this.model.yaw( this.speed * this.steer / 1000 );
// 車を前方、後方にすすませる
this.model.moveForward( this.speed );
}
/**----------------------------------------------------------------------
* loop_Proc
* 毎フレーム呼び出される 関数
-----------------------------------------------------------------------*/
public function loop_Proc(event:Event):void
{
//車のコントローラーの処理
this.driveCar();
//カメラの位置
var add_speed:Number = 0.2;
var tRot:Number = this.model.rotationY - 90;
var vec_x:Number = Math.cos(tRot* Math.PI / 180);
var vec_z:Number = Math.sin(tRot * Math.PI / 180);
this.camera.x += ((vec_x*2000 + this.model.x) - this.camera.x) * add_speed;
this.camera.y += (1000 - this.camera.y) * add_speed;
this.camera.z += ((vec_z*2000 + this.model.z) - this.camera.z) * add_speed;
//レンダリング
this.renderer.renderScene(scene, camera, viewport);
}
}
}
- アクセル [W] or [↑]
- バック [S] or [↓]
- 右 [D] or [→]
- 左 [A] or [左]
なんだかヌラヌラしてるなー
投稿者: d5 23 : 04
更新日:2008-04-22 23:57:30
|
|
|
| |