Wonderfulで始めるAlternativa3D

中級(コントローラー編)1.コントローラーとは?

コントローラーは、Object3Dの位置や回転を制御するものでキーボードコマンド等とバインディング(結合、binding)させることで様々な操作を可能にするクラスです。
現在 alternativa.engine3d.controllersパッケージ内にはCameraController、FlyController、WalkControllerの3つが用意されています(+基本クラスのObjectController)。

各クラスの違いは、別表をご覧ください。

CameraController

Cameraをコントロールする専用クラスで、camera(コントロールするカメラの設定)やfovStep(Field of View、視野角の調整)やzoomMultiplier(カメラの遠近調整)などCameraをコントロールする為だけのプロパティを持っています。

しかし最初に実装されたコントローラーな為に、Ver5.0の時点で実装されたコントローラの基本クラスであるObjectControllerを継承しておらず、Controllerの設計思想からは外れた(というか取り残された?)物となっています。

また、以下で紹介するFlyControllerやWalkControllerでも、cameraを取り扱う事が可能(objectプロパティにcamera3Dを代入)な上、先に書いたfovStepやzoomMultiplierも、cameraクラスのfovやzoomといったプロパティを直接操作するのと変わらない為、このCameraControllerは、Ver5.6.0の時点ではすでに過去の遺物的な物となっています。

FlyController

Object3Dを飛行状態でコントロールできるクラスです。
重力(gravity)や、地面の摩擦抵抗(airControlCoefficient)が無く、代わりに加速(acceleration)や減速(deceleration)のプロパティを持っています。また、メソッドにはrollLeft、rollRightがあり、進行方向に対してのひねりが出来るようになっています。

WalkController

Object3Dを歩く(または走る)状態でコントロールできるクラスです。
重力(gravity)や、地面の摩擦抵抗(airControlCoefficient)、地面からのジャンプを設定できますが、代わりに加速や減速ができません(基本スピードまでの加速や、基本スピードから0までの減速は可能)。


基本的な使用方法

基本的な使い方を、WalkControllerを使用して解説します。

コントロールする3Dオブジェクトを用意する

床と、WalkControllerで操作する3Dオブジェクトを用意します。
今回は、簡単な車の模型を用意しました。
なお、なるべくサンプルでは外部からファイルを読み込まない形で作成してますので、簡単な車といっても、頂点操作で結構ソースが長くなってしまいます。なので、自作Carクラス内で車をモデリングしています。

		//視点を俯瞰に設定
		template.camera.coords=new Point3D(500,-2000,2000);

		//床を作る
		var plane:Plane=new Plane(10000,10000,50,50);
		template.scene.root.addChild(plane)
		plane.cloneMaterialToAllSurfaces(new FillMaterial(0x666666,1,BlendMode.NORMAL,1));
		plane.z=-500

		//簡単な車を作成する
		var car:Car= new Car();
		// 3Dシーンのルートに追加します
		template.scene.root.addChild(car)

Controllerのインスタンスを作る

WalkControllerのインスタンスを作成します。
コンストラクタ、第一引数には、キーボードイベントを設定できる、Flash APIのDisplayObject(通常はthis.stage)を設定します。第二引数には、コントロールしたい3Dオブジェクト(Object3D、及びそのサブクラス。なのでcamera3Dも可)を指定します。
なお、第二引数省略してもかまいません(後でWalkController.object=で代入できます。)

	//Controllerのインスタンスを作る
	var walkController:WalkController=new WalkController(this.stage,car)

キーボードのキー(Keyboard.KEY)を関連付ける(Bind)する

コントローラーで使用するキーボードのキーや、マウス操作を、コントローラーの動作と関連付けします。
今回は、Alternativa3Dがデフォルトで設定されているキー操作のセットをsetDefaultBindingsメソッドを使用して関連付けします。
また初期状態では、マウス操作(ドラッグ)で方向が回転してしまいますので、
mouseEnabledプロパティをfalseで無効にします。

	//キーボードのキー(Keyboard.KEY)を関連付ける(Bind)する	
	walkController.setDefaultBindings();
	walkController.mouseEnabled=false


なお、setDefaultBindingsで関連付けされる、キーと動作は、以下の通りです。

W ACTION_FORWARD 前に移動
S ACTION_BACK 後に移動
A ACTION_LEFT 左に移動
D ACTION_RIGHT 右に移動
SPACE ACTION_UP 上に移動
Z ACTION_DOWN 下に指導
SHIFT ACTION_ACCELERATE 加速
UP ACTION_PITCH_UP 上向き回転(x軸で正方向に回転)
DOWN ACTION_PITCH_DOWN 下向き回転(x軸で負方向に回転)
LEFT ACTION_YAW_LEFT 左に回転(z軸で正方向に回転)
RIGHT ACTION_YAW_RIGHT 右に回転(z軸で負方向に回転)
M ACTION_MOUSE_LOOK マウスの方向に回転

移動スピードを設定する

ACTION_FORWARD、ACTION_BACK、ACTION_LEFT、ACTION_RIGHT、ACTION_UP、ACTION_DOWN時のスピードをspeedプロパティで設定します。speed=0でまったく動かなくなります。ちなみにデフォルトは0なのでスピードを設定しないと動きません。単位は、pixel/秒です。

なおACTION_PITCH_UP、ACTION_PITCH_DOWNの回転速度は、pitchSpeedプロパティ(単位は、radian/秒)でACTION_YAW_LEFT、ACTION_YAW_RIGHTの回転速度は、yawSpeedプロパティ(単位は、radian/秒)で設定できます。speedプロパティと違い両方ともデフォルトで1が設定されています。

	//移動スピードを設定する
	walkController.speed = 700; 

 

コントローラーの処理を実行する

キーボード操作やマウス操作に従い、コントローラーの処理を実行します。
scene.calculate();の前で実行するようにしてください。
これを忘れると、動きません。

	// Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
	// レンダリング前に実行したい処理を記述します。
	template.onPreRender = function():void {
		walkController.processInput()
	}

完成サンプル

キーボード操作を伴うので、ShadowBoxで開くようにしています。


.swf
(要 FlashPlayer10)
.src

正直、デフォルトのキー操作は個人的に好きではありませんw
また、車のコントローラーなので、横に水平移動とか、上下移動、上向き回転とか下向き回転等はありえない動きです。ということで、次はコントローラーを自分仕様にカスタマイズしてみたいと思います。

Menu

入門編

初級編

7. Sprite3Dとは?

8. MovieClipMaterial

中級(インタラクティブ編)

1. インタラクティブなオブジェクト

2. 反応するモデルと反応しないモデル

3. サーフェースごとのマウスイベント

4. フェースごとのマウスイベント

中級(コントローラー編)

1. コントローラーとは?

2. コントローラーをカスタマイズ

3. 重力・衝突判定

4. LookAt

中級(カメラ&View編)

1. カメラZOOMとFOV

2. 複数のカメラとView

3. Viewのクリッピング

中級(メッシュ作成編)

1. 頂点を作成する

2. 面を作成する

3. 表面を作成する

4. UVを設定する

5. メッシュを作る

実践・応用編

1. 読み込んだ画像で絵本を作る

3. GoogleNexusOne

4. 3Dスロット

5. ルービックキューブ

実験編

1. 3dsの読み込みと操作

2. イラレで作ったpathを押し出す

3. 押し出しによるText3D

4. 自作のマテリアルクラスを作る

5. フラットシェーディングマテリアル

6. 衝突判定を利用した跳ね返り

7. Sprite3Dによるパーティクル表現

8. Sprite3Dでピクセルレンダー

9. Objectのグロー、ブラー