iis服务器助手广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >HTML5怎么制作一个重力感应球
  • 254
分享到

HTML5怎么制作一个重力感应球

2024-04-02 19:04:59 254人浏览 八月长安
摘要

这篇“HTML5怎么制作一个重力感应球”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“htm

这篇“HTML5怎么制作一个重力感应球”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“html5怎么制作一个重力感应球”文章吧。

重力传感器是一个非常常见的内置在智能手机等移动设备中的传感器,基本作用就是获得移动设备的重心。当移动设备倾斜或翻转时,重心会发生变化,而重力传感器将如实地记录下重心变化的过程并通过数据反映出来。

由于安全问题,浏览器可能会默认关闭一些配置,因此读者需要从欧朋浏览器地址栏中输入opera:config后回车,找到需要的相关参数,进行调整

如果你在测试时,发现无法监测到deviceorientation传出来的值,有可能是因为关闭了对deviceorientation的支持,那你可以试着照上图所示的方式,在地址栏中输入opera:config,回车,然后找到Orientation选项并勾选上

1. 了解重力传感器

传感器是移动互联网WEB App开发中非常重要的一个设备,涉及多个应用概念。在HTML5的Device api中,DeviceOrientation事件规范提供了3个DOM事件,分别是:deviceorientation、compassneedscalibration和devicemotion。本节主要讲解的是deviceorientation。

DeviceOrientation规范定义的是返回alpha、beta和gamma三个值,如下面的代码所示:

window.addEventListener("deviceorientation", function(event){

//返回值event.alpha、event.beta、event.gamma

}, true);

当设备水平放在桌面上时,其event返回的值如下:

{alpha: 90,

beta: 0,

gamma: 0};

而此时,其设备的朝向值应为360-alpha(当设备翻转时,以此公式为基础进行朝向运算),

当设备的转动变成以x轴为中心自转时,其event返回的值如下:

{alpha: 90,

beta: 90,

gamma: 0};

当设备的转动变成以z 轴为中心自转时,则alpha值发生变化,

当设备的转动变成以y 轴为中心自转时,则gamma值发生变化,

当DeviceOrientation规范的Devicemotion事件的加速度计还允许有重力时,则会出现:

{x: 0,

y: 0,

z: 9.81};

而这时,如果设备处于自由落体的情况时,它的值应该是:

{x: 0,

y: 0,

z: -9.81};

如果设备在高速行驶的汽车中时,它的值应该是(这是复杂应用,目前还没有良好的支持,

有兴趣的读者可以继续深入研究):

{acceleration: {x: v^2/r, y: 0, z: 0},

accelerationIncludingGravity: {x: v^2/r, y: 0, z: 9.81},

rotationRate: {alpha: 0, beta: 0, gamma:-v/r*180/pi} };

2. 重力感应球示例

为了让读者更好地了解重力传感器,建立起感性的认识,我们通过重力感应球的示例来展示重力传感器的开发过程和技巧。

重力传感器示例的代码如代码如下:

<!DOCTYPE html>

<html lang=zh-cn manifest=index.manifest>

<!-- 离线缓存图片文件,以便下次使用相关图片时可以迅速载入 -->

<head>

<title>重力感应球</title>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width,

height=device-height,initial-scale=1.0, minimum-scale=1.0,

maximum-scale=1.0,user-Scalable=no, target-densityDpi=device-dpi">

<script type="text/javascript" charset="utf-8" src="foropera.js"></script>

</head>

<body style="margin-top:0px;margin-left:0px;">

<div id="helpme" style="opacity:

0.9;position:absolute;z-index:1000;top:100px;left:20px;display:none;backgrou

nd-color:#333;-webkit-border-radius:15px;right:20px;">

<center style="margin-left:10px;margin-right:10px;border-bottom:1px #777

solid;"><span

style=color:#fff;height:30px;line-height:60px;font-size:26px;margin-top:25px;

margin-bottom:35px;">重力感应球</span></center>

<div

style="color:#ccc;font-size:18px;margin-left:20px;margin-right:20px;margin-top:

16px;">HTML5的Device API集成了调取重力感应和重力加速的功能。基于此功能,欧朋浏览器 HTML5

体验版可以实现重力感应,并在网页上呈现效果。此demo就是利用了这个特性。晃动手机,便可实现小球在

网页上滚动的特效。</div>

<br>

<center><button onclick="hiddeDiv('helpme')" style="opacity:1;

background-color:#777;border:0px;height:35px;line-height:25px;color:#eee;

width:140px;font-size:18px;-webkit-border-radius:5px;">关闭提示

</button></center>

<br>

</div>

<div id="help"

style="z-index:1000;position:absolute;left:0px;top:30px;"><imgsrc="help.png"

onclick="showhelp('')"></div>

<script type="text/javascript">

function hiddeDiv(id){

document.getElementById('helpme').style.display='none';

}

function showhelp(){

document.getElementById('helpme').style.display='';

}

</script>

<canvas id="ball"

style="margin-top:0px;margin-left:0px;z-index:10;"></canvas>

<img id="gunball" style="display:none" src="opera_ball.png"></img>

<script type="text/javascript">

var cur_x = 0;

var cur_y = 0;

var ball_radius = 50; //球的半径,用来判断是否靠近边界,进行碰撞检测用

var initialized = false; //初始化的值

var ww;

var wh;

var speed_x = 0;

var speed_y = 0;

var accel_x;

var accel_y;

var friction_accel = 0.02; //摩擦系数

var interval = 33; //毫秒数, 约为30帧每秒

var bg_color = "#EEEEEE";

var fg_color = "#333";

var absorbing_rate = 0.5; //弹力消耗比例

var gunball=new Image();

gunball.src="opera_ball.png"; //实例化的滚球的图像

var opera_pix_bg=new Image();

opera_pix_bg.src="opera_pix_bg2.png"; //实例化的背景图

function inSameDirection(a, b){ //方向判断函数

return a > 0 && b > 0 || a <= 0 && b <= 0;

}

function getCurpos(cur_pos, speed, accel, boundary){ //当前位置判断函数

if(speed == 0 &&Math.abs(accel) <= friction_accel)

return [cur_pos, speed];

start_speed = speed;

f_accel = (speed > 0 ? -friction_accel:friction_accel); //摩擦力导致速度变慢

speed += accel + f_accel; //速度的方向被改变了

if(!inSameDirection(f_accel, accel) &&

!inSameDirection(f_accel, start_speed) &&

!inSameDirection(start_speed, speed)){

//因为摩擦,球的速度逐渐为0

speed = 0;

}

cur_pos += (start_speed + speed)/2; //边界检测

if(cur_pos> boundary - ball_radius){

cur_pos= boundary - ball_radius;

speed = -speed * absorbing_rate;

}

else if(cur_pos < 0){

cur_pos = 0;

speed = -speed * absorbing_rate;

}

return [cur_pos, speed];

}

function physics(){ //物理运动计算函数

var x = getCurpos(cur_x, speed_x, accel_x, ww);

cur_x = x[0];

speed_x = x[1];

var y = getCurpos(cur_y, speed_y, accel_y, wh);

cur_y = y[0];

speed_y = y[1];

}

function paint(){ //绘图函数

var ball_canvas = document.getElementById('ball');

var ctx = ball_canvas.getContext('2d');

physics(); //引入物理运动计算的函数

ctx.drawImage(opera_pix_bg, 0,0, ww, wh );

ctx.drawImage(gunball, cur_x,cur_y, 50, 50 );

setTimeout("paint()", interval);

}

function clearCanvas(){ //擦除画布的函数

var ball_canvas = document.getElementById('ball');

var ctx = ball_canvas.getContext('2d');

}

function update(evt){ //更新画布的函数

var ball_canvas = document.getElementById('ball');

if(ball_canvas.width != window.outerWidth ||

ball_canvas.height != window.outerHeight){

ball_canvas.width = window.outerWidth;

ball_canvas.height = window.outerHeight;

clearCanvas();

}

ww = ball_canvas.width;

wh = ball_canvas.height;

//根据重力传感器的值计算加速度

accel_x = Math.sin(evt.gamma/180 * Math.PI);

accel_y = Math.sin(evt.beta/180 * Math.PI);

if(!initialized){

cur_x = ww/2 + ball_radius; //滚球当前位置的x坐标值

cur_y = wh/2 + ball_radius; //滚球当前位置的y坐标值

initialized = true;

clearCanvas();

paint(); //调用绘图函数

}

}

function preload(){

var ball_canvas = document.getElementById('ball');

if(ball_canvas.width != window.outerWidth ||

ball_canvas.height != window.outerHeight){

ball_canvas.width = window.outerWidth;

ball_canvas.height = window.outerHeight;

}

ww = ball_canvas.width;

wh = ball_canvas.height;

paint();

}

preload();

window.addEventListener('deviceorientation', update, true);

</script>

</body>

</html>

晃动、翻转设备时,球会随着设备的变动而滚动弹跳。本代码的执行效果如下图:

3. 本例小结

本例是众多传感器设备通过HTML5标准在浏览器上实现的一个典型案例。到目前为止,如果开发者要做重力传感器的实验,又买不起iPhone或者iPad的话,搞个便宜的Android系统手机,装上欧朋H5就可以试验了。

在开发重力传感器的时候,新手往往会忽略几个问题,在此我们特意提出来供读者引以为鉴。

(1) 传感器得出来的值是非稳定态的,往往有噪声数据,因此,如果开发者直接使用传感器传过来的值进行绘图,一定会出现滚球闪动和瞬间不受控的现象。很多开发者在滤波面前往往一愁莫展,网上大量的各种滤波算法都是有用的,而且是合理的,例如平均值滤波、去除最大值和最小值的滤波、加权平均滤波,甚至卷积分滤波等。但是,经过实践,我们总结出一个很有效的。

小经验 通过setInterval这样的定时器去取值,把帧数定在30帧左右,就可以实现99%以上的完美滤波。我们把这个方法称为时间点抽样滤波。

(2) iOS系统里(iPhone、iPad和iPod)的Safari在直接获取传感器数据时,往往没有噪声,原因是浏览器已经消过噪了。这是好事,也是坏事。好事是开发者不用操心传感器的示波不稳定问题。坏事是开发者得到的数据都是经过过滤的,而且没有办法得到第一手数据,往往在特殊情况下不利。在摇动、晃动等行为发生时,用重力传感器是不合适的。在标准中, devicemotion事件可以判断摇动、晃动等行为的。

虽然在标准中有提示可以通过加速度和角度来计算摇动、晃动等行为,但很多开发者可能会不适应,建议使用devicemotion事件。

以上就是关于“HTML5怎么制作一个重力感应球”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网node.js频道。

--结束END--

本文标题: HTML5怎么制作一个重力感应球

本文链接: https://www.lsjlt.com/news/92266.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • HTML5怎么制作一个重力感应球
    这篇“HTML5怎么制作一个重力感应球”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“HTM...
    99+
    2024-04-02
  • 怎么用HTML5制作一个简单的弹力球游戏
    本篇内容主要讲解“怎么用HTML5制作一个简单的弹力球游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用HTML5制作一个简单的弹力球游戏”吧!  【创建...
    99+
    2024-04-02
  • 如何用HTML5制作一个简单的弹力球游戏
    这篇文章主要介绍“如何用HTML5制作一个简单的弹力球游戏”,在日常操作中,相信很多人在如何用HTML5制作一个简单的弹力球游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 怎么用HTML5制作一个简单的桌球游戏
    本篇内容介绍了“怎么用HTML5制作一个简单的桌球游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!话说这...
    99+
    2024-04-02
  • 如何用HTML5制作一个简单的桌球游戏
    本文小编为大家详细介绍“如何用HTML5制作一个简单的桌球游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何用HTML5制作一个简单的桌球游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2024-04-02
  • html5中怎么制作一个loading图
    本篇文章给大家分享的是有关html5中怎么制作一个loading图,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。<!DOCTYPE&nb...
    99+
    2024-04-02
  • html5中怎么制作一个五角星
    html5中怎么制作一个五角星,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。<canvas></canvas...
    99+
    2024-04-02
  • 怎么在Android项目中实现一个重力传感器功能
    怎么在Android项目中实现一个重力传感器功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先我们创建一个传感器管理器和一个传感器监听器,管理器用来管理传感...
    99+
    2023-05-30
    android
  • HTML5中怎么制作一个注册页面
    本篇文章为大家展示了HTML5中怎么制作一个注册页面,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。<!DOCTYPE html> <ht...
    99+
    2024-04-02
  • 在html5中如何利用重力感应实现摇一摇换颜色可用来做抽奖
    这篇文章给大家介绍在html5中如何利用重力感应实现摇一摇换颜色可用来做抽奖,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。从网上找到了一个案例,是用来摇一摇换颜色的,非常好用,不过测试...
    99+
    2024-04-02
  • 微信小程序怎么加速度监听重力感应数据
    这篇“微信小程序怎么加速度监听重力感应数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序怎么加速度监听重力感应数据...
    99+
    2023-06-26
  • 怎么用Python制作一个文件去重小工具
    这篇文章主要讲解了“怎么用Python制作一个文件去重小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python制作一个文件去重小工具”吧!前言常常在下载网络素材时有很多的重复文...
    99+
    2023-06-29
  • 怎么用HTML5的Canvas API制作一个简单猜字游戏
    本文小编为大家详细介绍“怎么用HTML5的Canvas API制作一个简单猜字游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用HTML5的Canvas API制作一个简单猜字游戏”文章能帮助大家解...
    99+
    2024-04-02
  • 怎么用Android贝塞尔曲线绘制一个波浪球
    本篇内容介绍了“怎么用Android贝塞尔曲线绘制一个波浪球”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果如下所示:先来总结下 Wave...
    99+
    2023-06-30
  • css怎么制作一个三角形
    这篇文章主要讲解了“css怎么制作一个三角形”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css怎么制作一个三角形”吧!在很多页面制作中会设计到突出一个三角...
    99+
    2024-04-02
  • QT怎么制作一个ListView列表
    这篇文章主要介绍“QT怎么制作一个ListView列表”,在日常操作中,相信很多人在QT怎么制作一个ListView列表问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”QT怎么制作一个ListView列表”的疑...
    99+
    2023-07-05
  • 怎么在html5中利用canvas绘制一个圆环
    今天就跟大家聊聊有关怎么在html5中利用canvas绘制一个圆环,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现过程:首先:html部分代码如下:<canvas ...
    99+
    2023-06-09
  • 怎么在html中制作一个表格
    今天就跟大家聊聊有关怎么在html中制作一个表格,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便,适...
    99+
    2023-06-14
  • css中怎么制作一个三角形
    本篇文章为大家展示了css中怎么制作一个三角形,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 制作方法首先我们写一个p:.triangl...
    99+
    2024-04-02
  • 自己怎么制作一个小程序
    本篇内容介绍了“自己怎么制作一个小程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1.选择小程序  小程序是由小程序账号,小程序源码,...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作