11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 1717|回复: 1
上一主题 下一主题

[AIR 开发] Air中移动端陀螺仪即三轴加速度计的矫正及使用案例

[复制链接] TA的其它主题
发表于 2020-2-1 19:47:59 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
air中可以调用移动端设备的三轴加速度计传感器,我用它来做一个坡度检测(水平仪)来用用,并矫正一些问题。
首先说说air中三轴加速度传感器封装后的问题,参考文档里说重力加速度按照9.8 m/s*s来计算,但实际根据地区位置不同,重力加速度也有出入,所以需要矫正,矫正方法就是任意静止时刻三轴加速度矢量和即为当前地区重力加速度。
  1. accelX = event.accelerationX;
  2.         accelY = event.accelerationY;
  3.         accelZ = event.accelerationZ;
  4.         g = Math.sqrt(accelX*accelX+accelY*accelY+accelZ*accelZ);//实际重力加速度为三轴静止时加速度矢量和
复制代码

然后是坡度检测(水平仪)功能,我这里做出了x y轴方向的角度检测和一个坡度检测,x,y轴方向和水平面角度也就是对x,y轴单位化(除以g)加速度的反正弦值,而坡度则是z轴单位化加速度的反余弦值。这个是空间几何的简单问题,这里要注意的是反三角函数定义域问题(-1,1),所以需要对直接测量结果进行范围限制以免出现NaN情况。

as3新人的第一个贴,以后会多发帖的,有交流的朋友可以加好友一起学习。
代码直接附着吧
  1. //水平计示例  可显示x y方向偏角 和 坡面角度  计算了当地实际的重力加速度值
  2. //在舞台上添加一个ball的影片剪辑  添加mx my mz三个动态文本来显示x y方向角度和坡面角度
  3. import flash.events.Event;

  4. var accelX:Number;//x轴加速度
  5. var accelY:Number;//y轴加速度
  6. var accelZ:Number;//z轴加速度
  7. var g:Number;//重力加速度

  8. var fl_Accelerometer:Accelerometer = new Accelerometer();
  9. fl_Accelerometer.addEventListener(AccelerometerEvent.UPDATE, fl_AccelerometerUpdateHandler);

  10. function fl_AccelerometerUpdateHandler(event:AccelerometerEvent):void
  11. {
  12.         accelX = event.accelerationX;
  13.         accelY = event.accelerationY;
  14.         accelZ = event.accelerationZ;
  15.         g = Math.sqrt(accelX*accelX+accelY*accelY+accelZ*accelZ);//实际重力加速度为三轴静止时加速度矢量和
  16.        
  17.         //计算x y方向偏角 计算坡面角度  因系统g为9.8,所以需要根据实际情况转换  因反三角函数定义域为-1到1,所以要规范化防止出现NaN
  18.         mx.text = Math.asin(Math.abs(accelX/g)>1?1:Math.abs(accelX/g))/Math.PI*180 + "";
  19.         my.text = Math.asin(Math.abs(accelY/g)>1?1:Math.abs(accelY/g))/Math.PI*180 + "";
  20.         mz.text = Math.acos(Math.abs(accelZ/g)>1?1:Math.abs(accelZ/g))/Math.PI*180 + "";
  21.        
  22. }

  23. ball.addEventListener(Event.ENTER_FRAME, moveBall);
  24. function moveBall(evt:Event){
  25.         ball.x -= accelX*30;
  26.         ball.y += accelY*30;
  27.        
  28.         if(ball.x > (480-ball.width/2)){
  29.                 ball.x = 480-ball.width/2;
  30.         }
  31.         if(ball.x < (0+ball.width/2)){
  32.                 ball.x = 0+ball.width/2;
  33.         }
  34.         if(ball.y > (800-ball.width/2)){
  35.            ball.y = 800-ball.width/2;
  36.         }
  37.         if(ball.y < (0+ball.width/2)){
  38.                 ball.y = 0+ball.width/2;
  39.         }
  40. }



复制代码



评分

参与人数 2银子 +76 金子 +1 贡献 +1 收起 理由
最后一批aser + 66 T大抠b
TKCB + 10 + 1 + 1 11RIA 闪客社区,就是这么专业

查看全部评分

发表于 2020-2-1 22:40:11 | 显示全部楼层
【11RIA 闪客社区,评分公示】:
是否有价值:一般(银子 +10  贡献 +1)
是否原创:是(金子 +1)
是否翻译:否
如对自己的评分有疑问,则咨询版主、管理员等。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表