Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

435
Views
La forma más sencilla de resolver el bloqueo de gimbal cuando se usan eventos DeviceOrientation en javascript: cómo hacer una aplicación perfecta de nivel de burbuja/nivel de burbuja

Empezando con...

 window.addEventListener("deviceorientation", handleDeviceTilt); function handleDeviceTilt(event){ // Here we can use event.beta, event.gamma // Note that we don't need event.alpha because that's just the compass as we // don't need to know which way is north to build a simple bubble-level app // or similar apps. }

...en este caso, los valores beta y gamma son agradables y utilizables siempre que el teléfono o la tableta se mantengan paralelos al suelo (como descansando sobre una mesa). Pero cuando el teléfono o la tableta se mantienen paralelos a una pared, no podemos obtener valores realistas. gamma se vuelve especialmente loco cuando el dispositivo se sostiene en posición vertical (es decir, en modo retrato), que es la forma más común de sostener un dispositivo móvil.

Observe el problema con un dispositivo Android mirando el cubo AQUÍ

ingrese la descripción de la imagen aquí

Necesitamos calcular los ángulos reales para poder usar la información de inclinación con precisión en la aplicación. La pregunta es,

¿Cuál sería la forma más sencilla de calcular los ángulos reales como realBeta y realGamma (quizás usando Math.cos() y Math.sin() o mediante algún otro método) para desbloquear el llamado bloqueo de cardán? ¿Se puede hacer esto sin matrices y/o cuaterniones? Mi conjetura es "sí" porque la "distorsión" en gamma es proporcional de alguna manera a beta. Si los cuaterniones son la única solución, entonces, ¿cómo obtenemos exactamente realGamma o actualGamma o fixedCorrectGamma usándolos?

Nota 1: hay una aplicación de nivel de burbuja en PlayStore que muestra perfectamente los ángulos de inclinación reales del dispositivo. Así que hay pruebas de que es factible. Sin embargo, a partir de 2021 parece que no hay un código fuente abierto disponible para una aplicación de este tipo escrita en javascript.

Nota 2: este problema se ha mencionado aquí .

Nota 3: La precisión es necesaria. Cuanto más nos acerquemos a los ángulos exactos, mejor. alpha se puede omitir por simplicidad.

¿PARA QUE SIRVE ESTO?

Al resolver este problema, podríamos usar la deviceorientation del dispositivo para hacer algo similar a esto, ingrese la descripción de la imagen aquí


...o, por ejemplo, podríamos usar gamma para conducir un automóvil en un juego de carreras verticales. ingrese la descripción de la imagen aquí


Puede observar el problema en acción visitando AQUÍ (o buscando algo similar) en su dispositivo móvil. Encienda el interruptor que dice [ Mostrar ángulos de orientación ] y observe γ ( gamma ) a medida que beta se acerca a 90 grados. También vea lo que le sucede al Gyro-Cube cuando intenta sostener su dispositivo en una posición perfectamente vertical.

Pensamiento final,

Es posible que necesitemos algunas matemáticas mágicas arcanas.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Me temo que obtener la información que está buscando solo a través del evento de deviceorientation del dispositivo no es posible precisamente por la razón que usted mismo dice: bloqueo de cardán .

Hay hordas de matemáticos estudiando en este sentido, el resultado que podemos aprender de sus estudios es que la única solución al problema del bloqueo del cardán es evitarlo: cuando comenzamos a acercarnos demasiado, tenemos que cambiar nuestro enfoque.

Una forma alternativa de obtener ese ángulo (que funciona solo cuando el teléfono está casi vertical , exactamente cuando necesitamos una alternativa) podría ser usar datos de devicemotion del dispositivo en lugar de datos de deviceorientation del dispositivo.

 window.addEventListener("devicemotion", event => { const { x } = event.accelerationIncludingGravity; const radiantsRes = Math.asin(x / 9.80665); const degreesRes = (radiantsRes * 180) / Math.PI; console.log(degreesRes.toFixed(2), radiantsRes.toFixed(10)) });

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!