es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo giras las entidades de Ursina alrededor de sus ejes locales?

No puedo hacer que mi código para rotar un objeto 3D alrededor de sus ejes locales funcione correctamente. Estoy usando el motor de juegos Ursina. Los objetos 3D que quiero rotar extienden la clase Entity, que tiene una propiedad de rotation que son ángulos de Euler. Aprendí a través de pruebas que Ursina realiza rotaciones de Euler en el orden Z, X, Y, corríjame si estoy equivocado. No encontré el orden de Euler en la documentación de Ursina.

import numpy as np
from scipy.spatial.transform import Rotation as R
from ursina import *

class FreeRotateEntity(Entity):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def rotate(self, angles):
        self.rotation = Vec3(*[360 + a if a < 0 else a for a in [
            R.from_matrix(
                np.matmul(
                    R.from_euler('zxy', (self.rotation.z, self.rotation.x, self.rotation.y), degrees=True).as_matrix(),
                    R.from_euler('zxy', [angles[i] for i in (2, 0, 1)], degrees=True).as_matrix()
                )
            ).as_euler('zxy', degrees=True)[i] for i in (1, 2, 0)
        ]])

class Ship(FreeRotateEntity):
    …

El código multiplica la matriz de rotación actual del objeto con la matriz de la nueva rotación (alrededor de ejes locales, no globales) que se aplicará. No rota correctamente.

Intenté intercambiar el orden de la multiplicación de las matrices, cambiar el orden de los ángulos de Euler y usar scipy.spatial.transform.Rotation.apply en lugar de la multiplicación de matrices, pero ninguno de estos funcionó.

¿Qué hice mal en el método rotate?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Es difícil decir exactamente qué puede estar mal con el método rotate sin conocer el comportamiento específico que no está funcionando correctamente. Sin embargo, algo a tener en cuenta es que los ángulos de Euler pueden sufrir de bloqueo de cardán, lo que puede causar un comportamiento inesperado al rotar alrededor de múltiples ejes. Además, el orden de las operaciones para la multiplicación de matrices puede ser importante al realizar rotaciones.

    Una posible solución podría ser utilizar cuaterniones en lugar de ángulos de Euler para las rotaciones, ya que los cuaterniones no sufren de bloqueo de cardán y pueden proporcionar un comportamiento de rotación más suave y predecible. La clase scipy.spatial.transform.Rotation también puede proporcionar métodos de conversión entre cuaterniones y matrices de rotación. Además, puede ser necesario verificar el orden de la multiplicación de matrices para asegurar el comportamiento de rotación correcto.

    En general, puede ser útil proporcionar detalles más específicos sobre el comportamiento esperado y los problemas encontrados para identificar cualquier problema con el método rotate.

Comments are closed.