2011-01-29 2 views
2

나는 이전에 Firefox의 MozOrientation에서 작동하는 미로 게임을 만들었습니다. 나는 이제 WebKit과 함께 작동하도록 노력하고 있습니다 ...장치 방향을 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 

는 어떤 도움을 크게 감상 할 수있다 :)

답변

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의 베타 값은 모바일 Safari의 값보다 정확히 180 작습니다. Firefox 및 모바일 Safari의 x 값은 거의 같아야합니다 (x).

+0

우수 감사합니다. julesj :) 이것은 잠시 동안 나를 괴롭 히고 있습니다 ... 저는 잠시 눈부신 명백한 수학을 놓치고 있다고 생각했습니다. 내 화이트 보드 다이어그램과 방정식으로 가득 차 있습니다 ... – sydlawrence

+0

어떻게'DeviceMotionEvent' 정상화하는 모든 생각을? – yckart

0

다른 하나를 계산할 수 있어야합니다. 내가보기에 문제는 Mozilla가 반환하는 데이터를 의미하지 않는다는 것입니다. 저는 ipad, iphone4 및 nokia n900의 세 가지 모바일 장치로 현재 작업하고 있습니다. iOS 및 사파리로 작업 할 때 accelerationIncludingGravity가 발생하면 값이 -9.8에서 9.8로 변경됩니다. 그것들은 각 도끼에 영향을 미치는 중력의 가치입니다. 삼각법을 사용하여 각 도끼의 각도를 계산할 수 있습니다. iphone4에서 방향을 잡으면 각 도끼에서 각도를 직접 얻을 수 있습니다.

이 문제는 브라우저가 Mozilla를 기반으로하는 노키아 n900과 함께 제공됩니다. 해당 브라우저는 -1에서 1로만 데이터를 반환합니다. 설명서에는 각 도끼의 기울기가 표시되어 있습니다. 무슨 단서 요? 코사인? 아니면 각도 180도? 저는 그것이 수평으로 놓았을 때 코사인이라고 생각합니다. 0을 반환하고 수직으로 놓으면 1을 얻습니다. 그리고 거꾸로 -1을 반환합니다. 또한, aprox에서 60도 기울이면 1/2을 반환합니다.

Firefox에서 Macbook 랩톱을 사용할 때 데이터 x, y 및 z는 코사인으로 표시됩니다.

+0

실제 함수를 하나의 값 집합에서 다른 값 집합으로 바꾸려면, 알려 주시면 정말 좋아할 것입니다! 지금까지 솔루션에 가장 가까운 것 같습니다! 나는 몇 달 동안 노력해 왔고, 나는 그저 길을 잃었다. – sydlawrence

1

이 코드가 모든 것을 명확히하기를 바랍니다.

모질라는 각도를 얻기 위해, 그래서 각의 죄를 반환 ...

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

웹킷이를 반환 :이 코드를 반환 베타와 감마의 값을 직접 일치시킬 수없는 값이지만 각 도끼에서 가속. (때로는 데이터를 반환하기 때문에, 심지어 전화를 가속하지 않고, 그것보다 9.8이다)

를 그런 다음,

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 

청소가되는합니다 (노래 변화가 반환 값을 통일하는 단지입니다) ... 각도를 얻을 수 있습니다

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

각 도끼의 의미는 다음과 같습니다. X-> 오른쪽 또는 왼쪽으로 이동하는 사람의 기울기. + 버튼을 오른쪽으로 (시계 방향으로) 기울이면 볼륨이 올라갑니다. Y> 잠금/켜기 - 끄기 버튼이 위로 (각도 +) 또는 아래로 (각도 -)있을 때 모바일이 가동 중인지 알려줍니다. 그것은 바닥과 관련된 모바일의 성향을 알려줍니다. (평면 X-Z를 가진 Y 벡터의 각도) Z-> 모바일 화면이 위로 (각도 +) 또는 거꾸로 (각도 -) 있는지 확인합니다. 평면상의 Z 벡터의 각도입니다. Y-X

희망이 있습니다.

어쨌든이 작업을 쉽게하기 위해 일부 GWT 수업을 진행 중입니다. 어렵지는 않지만 시간이별로 없습니다.

0

Mozilla Firefox는 이제 W3C DeviceOrientation Events API를 완벽하게 지원합니다. 더 이상 웹 응용 프로그램에 MozOrientation을 사용하면 안됩니다.

관련 문제