【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
air中可以调用移动端设备的三轴加速度计传感器,我用它来做一个坡度检测(水平仪)来用用,并矫正一些问题。 首先说说air中三轴加速度传感器封装后的问题,参考文档里说重力加速度按照9.8 m/s*s来计算,但实际根据地区位置不同,重力加速度也有出入,所以需要矫正,矫正方法就是任意静止时刻三轴加速度矢量和即为当前地区重力加速度。
- accelX = event.accelerationX;
- accelY = event.accelerationY;
- accelZ = event.accelerationZ;
- g = Math.sqrt(accelX*accelX+accelY*accelY+accelZ*accelZ);//实际重力加速度为三轴静止时加速度矢量和
复制代码
然后是坡度检测(水平仪)功能,我这里做出了x y轴方向的角度检测和一个坡度检测,x,y轴方向和水平面角度也就是对x,y轴单位化(除以g)加速度的反正弦值,而坡度则是z轴单位化加速度的反余弦值。这个是空间几何的简单问题,这里要注意的是反三角函数定义域问题(-1,1),所以需要对直接测量结果进行范围限制以免出现NaN情况。
as3新人的第一个贴,以后会多发帖的,有交流的朋友可以加好友一起学习。
代码直接附着吧
- //水平计示例 可显示x y方向偏角 和 坡面角度 计算了当地实际的重力加速度值
- //在舞台上添加一个ball的影片剪辑 添加mx my mz三个动态文本来显示x y方向角度和坡面角度
- import flash.events.Event;
- var accelX:Number;//x轴加速度
- var accelY:Number;//y轴加速度
- var accelZ:Number;//z轴加速度
- var g:Number;//重力加速度
- var fl_Accelerometer:Accelerometer = new Accelerometer();
- fl_Accelerometer.addEventListener(AccelerometerEvent.UPDATE, fl_AccelerometerUpdateHandler);
- function fl_AccelerometerUpdateHandler(event:AccelerometerEvent):void
- {
- accelX = event.accelerationX;
- accelY = event.accelerationY;
- accelZ = event.accelerationZ;
- g = Math.sqrt(accelX*accelX+accelY*accelY+accelZ*accelZ);//实际重力加速度为三轴静止时加速度矢量和
-
- //计算x y方向偏角 计算坡面角度 因系统g为9.8,所以需要根据实际情况转换 因反三角函数定义域为-1到1,所以要规范化防止出现NaN
- mx.text = Math.asin(Math.abs(accelX/g)>1?1:Math.abs(accelX/g))/Math.PI*180 + "";
- my.text = Math.asin(Math.abs(accelY/g)>1?1:Math.abs(accelY/g))/Math.PI*180 + "";
- mz.text = Math.acos(Math.abs(accelZ/g)>1?1:Math.abs(accelZ/g))/Math.PI*180 + "";
-
- }
- ball.addEventListener(Event.ENTER_FRAME, moveBall);
- function moveBall(evt:Event){
- ball.x -= accelX*30;
- ball.y += accelY*30;
-
- if(ball.x > (480-ball.width/2)){
- ball.x = 480-ball.width/2;
- }
- if(ball.x < (0+ball.width/2)){
- ball.x = 0+ball.width/2;
- }
- if(ball.y > (800-ball.width/2)){
- ball.y = 800-ball.width/2;
- }
- if(ball.y < (0+ball.width/2)){
- ball.y = 0+ball.width/2;
- }
- }
复制代码
|