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

302
Views
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 answers
Answer question

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 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!