
Wonderfulで始めるAlternativa3D
コントローラーは、Object3Dの位置や回転を制御するものでキーボードコマンド等とバインディング(結合、binding)させることで様々な操作を可能にするクラスです。
現在 alternativa.engine3d.controllersパッケージ内にはCameraController、FlyController、WalkControllerの3つが用意されています(+基本クラスのObjectController)。
各クラスの違いは、別表をご覧ください。
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の時点ではすでに過去の遺物的な物となっています。
Object3Dを飛行状態でコントロールできるクラスです。
重力(gravity)や、地面の摩擦抵抗(airControlCoefficient)が無く、代わりに加速(acceleration)や減速(deceleration)のプロパティを持っています。また、メソッドにはrollLeft、rollRightがあり、進行方向に対してのひねりが出来るようになっています。
Object3Dを歩く(または走る)状態でコントロールできるクラスです。
重力(gravity)や、地面の摩擦抵抗(airControlCoefficient)、地面からのジャンプを設定できますが、代わりに加速や減速ができません(基本スピードまでの加速や、基本スピードから0までの減速は可能)。
基本的な使い方を、WalkControllerを使用して解説します。
床と、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)
WalkControllerのインスタンスを作成します。
コンストラクタ、第一引数には、キーボードイベントを設定できる、Flash APIのDisplayObject(通常はthis.stage)を設定します。第二引数には、コントロールしたい3Dオブジェクト(Object3D、及びそのサブクラス。なのでcamera3Dも可)を指定します。
なお、第二引数省略してもかまいません(後でWalkController.object=で代入できます。)
//Controllerのインスタンスを作る var walkController:WalkController=new WalkController(this.stage,car)
コントローラーで使用するキーボードのキーや、マウス操作を、コントローラーの動作と関連付けします。
今回は、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で開くようにしています。
正直、デフォルトのキー操作は個人的に好きではありませんw
また、車のコントローラーなので、横に水平移動とか、上下移動、上向き回転とか下向き回転等はありえない動きです。ということで、次はコントローラーを自分仕様にカスタマイズしてみたいと思います。
1. コントローラーとは?
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のグロー、ブラー