如何将deviceorientation映射到MozOrientation值

问题描述:

我之前创建了一个与Firefox的MozOrientation配合使用的迷宫游戏。我现在正在考虑让它和WebKit一起工作......如何将deviceorientation映射到MozOrientation值

但是Webkit使用w3c的DeviceOrientation。这些值看起来完全不同,但有人必须有一些算法才能从一个到另一个?或者我错过了一些简单的东西?

迷宫游戏github上链路 http://playground.marmaladeontoast.co.uk/labyrinth/

MozOrientation https://developer.mozilla.org/en/Detecting_device_orientation

DeviceOrientation http://dev.w3.org/geo/api/spec-source-orientation.html

我已经获得了一些采样值:

alpha = null          
beta = -178 
gamma = 4.57  

火狐

x = 0.035999998450279236 
y = -0.02800000086426735 
z = 1 

任何帮助,将不胜感激:)

我一直是这样有点玩耍。下面的来源'映射'x/gamma和y/beta可以理解的度数范围的替代方案。

MozOrientation.z的值与deviceorientation.alpha值完全不同。第一个返回垂直方向,后者返回一个罗盘值。因此这些值不可互换/可转换。

function displayOrientation(orientData){ 

    var x = Math.round(orientData.x); 
    var y = Math.round(orientData.y); 
    var z = orientData.z; 

    document.getElementById('x').value = x; 
    document.getElementById('y').value = y; 
    document.getElementById('z').value = z; 
} 

window.addEventListener("MozOrientation", function(orientData){ 

    var obj = {}; 
    obj.x = orientData.x * 90; 
    obj.y = orientData.y * 90; 
    obj.z = orientData.z; 

    displayOrientation(obj); 

}, true); 

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

    var obj = {}; 
    obj.x = orientData.gamma; 
    obj.y = orientData.beta; 
    obj.z = orientData.alpha; 

    displayOrientation(obj); 

}, true); 

看来目前的桌面Safari(5.0.3)根本不支持这个事件。台式机Chrome 9中的beta值比移动Safari中的低180。 Firefox和移动版Safari中的x值应大致相同。

+0

优秀的,谢谢julesj :)这一直在窃听我一段时间......我以为我只是缺少一些显而易见的明显的数学一段时间。我的白板充满了图表和方程... – sydlawrence 2011-02-11 19:51:40

+0

任何想法如何规范`DeviceMotionEvent`? – yckart 2013-04-19 17:36:35

你应该能够计算出另一个。 我看到的问题是Mozilla没有说明它返回的数据是什么意思。 我现在正在使用三种移动设备:ipad,iphone4和nokia n900。 当我使用iOS和Safari浏览器并获得accelerationIncludingGravity时,我的值从-9.8到9.8。那些影响每个斧头的重力值。然后使用三角函数,我可以计算出每个斧头的角度。 如果我在iphone4中定位,我可以直接在每个斧头的角度。

问题出在诺基亚n900,其浏览器基于Mozilla。该浏览器只返回从-1到1的数据。文档说,这是每个斧头的倾斜。在什么统一体?余弦?或者只是角度/ 180? 我猜这是余弦,因为当我把它放在水平位置时,它返回0,当我把它放在垂直位置时,它将变为1.倒过来,返回-1。此外,如果您将其倾斜到60度左右,则返回1/2。

据我所见,当使用带有Firefox的Macbook笔记本电脑时,数据x,y和z会以余弦形式出现。

我希望这段代码能够澄清一切。虽然这个值的代码返回不能与β和γ值直接匹配:

Mozilla的返回角度的罪恶如此,获得角...

X: Math.asin(eventInfo.x)*180/Math.PI 
Y: Math.asin(eventInfo.y)*180/Math.PI 
Z: Math.asin(eventInfo.z)*180/Math.PI 

的Webkit返回每个斧头的加速度。然后,为了获取角度......(唱的变化仅仅是统一的返回值)

X: Math.asin(clean(eventInfo.accelerationIncludingGravity.x/GRAVITY))*180/Math.PI 
Y: Math.asin(clean(-eventInfo.accelerationIncludingGravity.y/GRAVITY))*180/Math.PI 
Z: Math.asin(clean(-eventInfo.accelerationIncludingGravity.z/GRAVITY))*180/Math.PI 

作为清洁:(因为有时候,返回的数据,即使没有加速的手机,它比9.8)

function clean(data) 
{ 
    if(data<-1.0) 
    { 
     return -1.0; 
    } 
    else 
    {if(data>1.0) 
    { 
     return 1.0; 
    }else 
    { 
     return data; 
    }} 
} 

每个斧头的含义是: X->手机向左或向右倾斜。如果您将手机向右倾斜(顺时针),将音量调高。 Y->如果锁定/开/关按钮向上 - (角度+)或向下(角度 - ),则判断手机是否向上。它会告诉手机相对于地板的倾斜度。 (Y向量与平面X-Z的角度) Z->判断手机屏幕是朝上(角度+)还是倒置(角度 - )。这是在Z向量在平面的夹角X-Y

希望这是值得你!

无论如何,我正在研究一些GWT类来使这个工作更容易:)这并不困难,但我没有那么多时间。 我会告诉你

Mozilla Firefox浏览器现在完全支持W3C的DeviceOrientation事件API。您不应再在您的Web应用程序中使用MozOrientation