ANE で iPhone のジャイロの値を取得して Away3D のカメラを動かしてみました


Adobe のサンプルに ジャイロスコープ(Gyroscope)の ANE があったので、ちょっと試してみました。

ちなみにジャイロスコープとは何かというと、XYZ3軸の回転角度が取得できるセンサで、値は[ラジアン / 秒]で返ってきます。
iPhone のジャイロについてはここにわかりやすい説明があります。

このジャイロから、先に紹介した ANE(Netive Extention)を使用して値を取得し、この値を利用して Away3D 4.0 Beta のカメラをグリグリ動かしてみる AIR for iOS のアプリを試しに作ってみました。

Demo Movie

画像クリックでデモムービーが開きます。3Dモデルデータは SketchUp のギャラリーからお借りしました。


(動画を表示する VideoPlayer は StageVideo を使用していますので見れない方はこちら

 
今回のデモのコードはこんな感じです。

/*
Gyroscope の ANE に付属の Gyroscope クラスをインポートして使用しています。
プロジェクトは FlashBuilder の ActionScript モバイルプロジェクトを
AIR for iOS(AIR 3.3)でビルドしました。
*/

package
{
	import away3d.cameras.Camera3D;
	import away3d.containers.Scene3D;
	import away3d.containers.View3D;
	import away3d.loaders.Loader3D;
	import away3d.loaders.parsers.Parsers;
	
	import com.adobe.nativeExtensions.Gyroscope;
	import com.adobe.nativeExtensions.GyroscopeEvent;
	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Vector3D;
	import flash.net.URLRequest;
		
	public class GyroscopeExample extends Sprite
	{
		
		private var _gyro:Gyroscope;
		
		private var _view:View3D;
		private var _scene:Scene3D;
		private var _camera:Camera3D;
		
		private var _loader:Loader3D;
		
		public function GyroscopeExample()
		{
			Parsers.enableAllBundled();
			
			if( Gyroscope.isSupported )
			{
				setupGyro();
			}
			
			setup3d();
		}
		
		
		private function setup3d():void
		{
			_view = addChild(new View3D()) as View3D;
			_view.antiAlias = 4;
			_view.backgroundColor = 0xFFFFFF;
			
			_scene = _view.scene;
			_camera = _view.camera;		
						
			_loader = new Loader3D(true, null);
			_loader.load( new URLRequest("model/model.3ds"));
			_scene.addChild( loader );
			
			_loader.scaleX = _loader.scaleY = _loader.scaleZ = 6;
			_loader.y = -500;
			
			addEventListener( Event.ENTER_FRAME, render );
		}
		
		
		private function setupGyro():void
		{
			_gyro = new Gyroscope();
			_gyro.setRequestedUpdateInterval( 50 );
			_gyro.addEventListener( GyroscopeEvent.UPDATE, onChange );
		}
		
		private var _angleX:Number = 0;
		private var _angleY:Number = 0;
		private var _angleZ:Number = 0;
		
		private function onChange( e:GyroscopeEvent ):void
		{
			angleX += e.x * .1;
			angleY += e.y * .1;
			angleZ += e.z * .1;
			
			_camera.x = 1000 * Math.sin( _angleX );
			_camera.z = 1000 * Math.cos( _angleZ );
			_camera.y = 1000 * Math.sin( _angleY );
		}
		
		
		private function render( e:Event ):void
		{
			_camera.lookAt(new Vector3D());
			_view.render();
		}
		
		
	}
}

今回のコードも短いですね。
ANE を使えば、ジャイロを使用して 3D のカメラを動かすくらいならこれくらいのコードの量でできますので、興味がある方は挑戦してみてください。