タグ : Accelerometer

Accelerometer(重力センサ)について

[この記事はベータ版(2010/09/23版)でしか確認をとれていません。正式リリース後に変更されている可能性もありますので参考程度にご覧ください。]

Accelerometerはデバイスの傾きを検知するセンサーです。

使い方はGeoLoacationとよく似ています。
主にゲームなどで活躍しそうなクラスです!
使いようによってはかなり面白いかもしれません。

センサーはX,Y,Z軸の3方向に対して値を取得できます。
机の上に水平においた状態でx:0 , y:0 , z:0 になります。
値は-1から1まで変化すると思われます。

このセンサーの詳細はこちらで詳しく解説されています。

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import org.papervision3d.core.proto.CameraObject3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.view.BasicView;

	import flash.sensors.Accelerometer;
	import flash.events.AccelerometerEvent;

	public class Main extends Sprite
	{
		private var basicview:BasicView;
		private var materiallist:MaterialsList;
		private var cube:Cube;
		private var camera:CameraObject3D;
		private var accl:Accelerometer;

		private var rollingX:Number = 0;
		private var rollingY:Number = 0;
		private var rollingZ:Number = 0;
		private const FACTOR:Number = 0.5;
		private const rec:uint = 45;

		public function Main()
		{
			basicview = new BasicView();
			camera = basicview.camera;
			addChild(basicview);
			createObject();

			//重要なのは↓の3行
			accl = new Accelerometer();
			//センサーを更新する間隔ms
			accl.setRequestedUpdateInterval(50);
			accl.addEventListener(AccelerometerEvent.UPDATE, onRender);
		}

		private function createObject():void {
			//マテリアル生成
			materiallist = new MaterialsList();
			materiallist.addMaterial(new ColorMaterial(0xA65866), "front");
			materiallist.addMaterial(new ColorMaterial(0xA65866), "back");
			materiallist.addMaterial(new ColorMaterial(0x6258A6), "left");
			materiallist.addMaterial(new ColorMaterial(0x8B8aBF), "right");
			materiallist.addMaterial(new ColorMaterial(0xF2F2F2), "top");
			materiallist.addMaterial(new ColorMaterial(0xBF7256), "bottom");

			for (var i:uint = 0; i < 3; i++) {
				for (var j:uint = 0; j < 3; j++) {
					var c = new Cube(materiallist, 300, 400, 300);
					c.x = -400 + 400 * i;
					c.y = -400 + 400 * j;
					basicview.scene.addChild(c);
				}
			}
			basicview.camera.focus = 20;
		}
		private function onRender(e:AccelerometerEvent):void {

			rollingX = (e.accelerationX * FACTOR) + (rollingX * (1 - FACTOR));
			rollingY = (e.accelerationY * FACTOR) + (rollingY * (1 - FACTOR));
			rollingZ = (e.accelerationZ * FACTOR) + (rollingZ * (1 - FACTOR));

			camera.x = rollingX * 1000;
			camera.y = rollingY * 1000;

			basicview.startRendering();
		}
	}
}

Accelerometer + Papervision3Dサンプル