Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

436
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda