Wonderfulで始めるAlternativa3D

中級(コントローラー編)3.重力・衝突判定

WalkController固有のgravityプロパティに値を入れる事で、コントロールする3Dオブジェクトに重力を設定する事ができます。(デフォルトは0で、重力はありません)
ただし、重力を設定しただけでは、コントロールする3Dオブジェクトは、奈落へと落ちてしまいますので、衝突判定を有効にして、地面となるPlaneで止まるようにしないといけません。
ということで今回は、前回の車コントローラーを改造して、重力と衝突判定を設定してみます。

障害物を設定する

せっかく衝突判定入れるなら床だけでは物足りなさそうなので、障害物を配置してみます。
配置マップ書くのも面倒なので、今回はとりあえずランダムで配置。

			//障害物を作成する
			var boxArray:Array=[];
			for (var i:uint=0;i<50;i++) {
				boxArray.push(new Box(400,400,200))
				boxArray[i].x=(Math.round(90*Math.random())-45)*100
				boxArray[i].y=(Math.round(90*Math.random())-45)*100
				boxArray[i].z=100
				template.scene.root.addChild(boxArray[i])
				boxArray[i].cloneMaterialToAllSurfaces(new FillMaterial(0x666666));
				boxArray[i].setMaterialToSurface(new FillMaterial(0xCCCCCC),'top');
				boxArray[i].setMaterialToSurface(new FillMaterial(0x999999),'back');
				
			}
	

重力と衝突判定を有効にする

Alternativa3Dの重力は、正確に物理シミュレーションを行う物ではありません。
なので、gravityには値を適当に入れます。(注、gravityは加速係数ではなく下方向へのスピードです)
また重力が発生すると、ACTION_DOWN(moveDown)は無効になり、ACTION_UP(moveUp)はジャンプ機能となります。
ただし、jumpSpeedプロパティに0以上を代入していないと、ジャンプはしません(デフォルトは0)。

ということで、今回はSPACEキーにACTION_UPを関連付けしジャンプも可能にします。
なお衝突判定は、checkCollisionsプロパティをtrueに設定する事で有効になります。

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

		//重力を設定する
		walkController.gravity = 600;
		walkController.jumpSpeed = 300;
		walkController.checkCollisions = true;
	

衝突判定に使う、判定物を設定する

Alternativa3Dの衝突判定に使う物体はコントロールする3Dオブジェクトとは別の球体が使用されており、デフォルトではこの大きさが、100*100*100となっています。なので、そのままではコントロールする3Dオブジェクト(車)と大きさに差が出ますので、大きさを合わせます。
なお、この別の球体(衝突判定物)は、alternativa.engine3d.physicsパッケージ内のEllipsoidColliderクラスで作成されており、 WalkController(ObjectController)からは、colliderプロパティで取得する事ができるようになっています。

		//衝突判定に使う、判定物を設定する
		walkController.collider.radiusX=120
		walkController.collider.radiusY=120
		walkController.collider.radiusZ=25
	

サイズの設定は、EllipsoidColliderのradiusX、radiusY、radiusZプロパティを使用して設定します。
(それぞれ、球体のX方向、Y方向、Z方向の半径となります。)
注)Ver 5.6.0の段階で、楕円球を作成しControllerのYaw(左右回転)を使用した場合、colliderは回転しないバグ(仕様?)があるようです。なので、車より若干大きな球にしradiusXradiusYは同じにしています。

コントロールする3Dオブジェクトを衝突判定の非対象とする

単純な3Dオブジェクトの場合は、特に必要無いのですが、今回の様にObject3Dに複数のObject3Dをネストして作成された複雑なオブジェクトの場合は、ネストされているオブジェクトが、衝突判定物に引っかかり衝突が発生してしまい、とても挙動が変になる場合があります。(コントローラーがコントロールするのはあくまでobjectプロパティで登録された3Dオブジェクトのみで、ネストされた物まではデフォルトでは面倒みてくれません)

なので、Object3D内にネストしている3Dオブジェクトを衝突判定の非対象にします。
(実際には非対象にするのではなく、衝突判定に関与している物体として登録)
登録方法は、collider(EllipsoidCollider)のcollisionSetプロパティにObject3Dを入れたSet(alternativa.types.Set Flash APIのDictionaryのサブクラス)を渡します。

		//コントロールする3Dオブジェクトを衝突判定の非対象とする
		walkController.collider.collisionSet = car.ignoreSet;
	

car.ignoreSetは車を作る自作クラスの中で作成しています。

		public var ignoreSet;

		public function Car() {
				
		~
		
		ignoreSet = new Set();
		ignoreSet.add(body);
		ignoreSet.add(window);
		ignoreSet.add(tire1);
		ignoreSet.add(tire2);
		ignoreSet.add(tire3);
		ignoreSet.add(tire4);
	

初期位置の設定

今回はせっかく重力と衝突をつけたので、少し上方に配置して、最初に落下するところを見せています。

		//初期位置を設定する
		walkController.coords=new Point3D(0,0,500);		
	

完成サンプル

地面から外に出ると、奈落に落ちます(復帰できませんw)


.swf
(要 FlashPlayer10)
.src

先にも書きましたがAlternativa3Dの重力モデルや衝突モデルは、物理エンジンと言えるほどの精度を持っていません。とりあえず重力や衝突は出来るけど、跳ね返りなどは自分で色々工夫して実装する必要があり・・・その程度の物です。

 

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のグロー、ブラー