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

310
Visualizações
Actualizar una rotación intrínseca con una rotación extrínseca

Estoy tratando de modelar un Cubo de Rubik para un proyecto personal, usando Zdog para gráficos ligeros en 3D. Zdog usa un {x,y,z} para representar la rotación; creo que esto es esencialmente un ángulo de Tait-Bryan .

Para animar una rotación del lado superior, derecho, frontal, etc., adjunto los 9 bloques a un ancla en el centro del cubo y lo giro 90 grados en la dirección deseada. Esto funciona muy bien, pero cuando termina la animación, necesito "guardar" la traducción y la rotación en los 9 bloques. La traducción es relativamente simple, pero estoy atascado en la rotación. Básicamente necesito una función como esta:

 function updateRotation(xyz, axis, angle) { // xyz is a {x,y,z} vector // axis is "x", "y", or "z" // rotation is the angle of rotation in radians }

eso aplicaría la rotación del axis / angle en coordenadas mundiales al vector xyz en coordenadas de objeto . Originalmente solo tenía xyz[axis] += angle , pero esto solo funciona cuando ningún otro eje tiene rotación. Entonces pensé que podría usar una tabla de búsqueda, y creo que eso es posible ya que solo uso cuartos de vuelta, pero construir la tabla resulta más difícil de lo que pensaba.

Estoy empezando a sospechar que necesito traducir el vector xyz a alguna otra representación (¿matriz? ¿cuaternión?) y aplicar la rotación allí, pero no estoy seguro de por dónde empezar. Lo frustrante es que mis bloques están en la posición correcta al final de la animación; simplemente no estoy seguro de cómo aplicar la transformación principal para poder separarlos del principal sin perder la rotación.

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Por lo que puedo decir, esto no se puede hacer solo con los ángulos de Euler (al menos no de una manera fácil). Mi solución fue convertir a cuaterniones, rotar y luego volver a convertir a Euler:

 function updateRotation(obj, axis, rotation) { const {x, y, z} = obj.rotate; const q = new Quaternion() .rotateZ(z) .rotateY(y) .rotateX(x); const q2 = new Quaternion(); if (axis === 'x') { q2.rotateX(rotation); } else if (axis === 'y') { q2.rotateY(rotation); } else if (axis === 'z') { q2.rotateZ(rotation); } q.multiply(q2, null); const e = new Euler().fromQuaternion(q); obj.rotate.x = ex; obj.rotate.y = ey; obj.rotate.z = ez; obj.normalizeRotate(); }

Esto usa las clases Euler y Quaternion de math.gl.

(Resultó que Zdog en realidad usa ángulos ZYX Euler hasta donde pude ver, de ahí el orden de las rotaciones al crear el primer cuaternión).

about 4 years ago · Juan Pablo Isaza 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