ANE で iPhone のジャイロの値を取得して Away3D のカメラを動かしてみました
Adobe のサンプルに ジャイロスコープ(Gyroscope)の ANE があったので、ちょっと試してみました。
ちなみにジャイロスコープとは何かというと、XYZ3軸の回転角度が取得できるセンサで、値は[ラジアン / 秒]で返ってきます。
iPhone のジャイロについてはここにわかりやすい説明があります。
このジャイロから、先に紹介した ANE(Netive Extention)を使用して値を取得し、この値を利用して Away3D 4.0 Beta のカメラをグリグリ動かしてみる AIR for iOS のアプリを試しに作ってみました。
(動画を表示する 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 のカメラを動かすくらいならこれくらいのコードの量でできますので、興味がある方は挑戦してみてください。