Comportamiento extraño con matriz de transformación

Soy bastante nuevo en las matrices de transformación. Los estoy usando para traducir y rotar nodos y sus nodos secundarios. El siguiente código funciona cuando se aplica una vez, pero muestra un comportamiento extraño cuando se aplica muchas veces seguidas:

void Node::update() { Mat4 parentTrans = (haveParent ? parent->getTransform() : Mat4::Identity()); Mat4 thisTrans = this->getTransform(); Mat4 translate = Mat4::Translation(this->getPosition()); Mat4 rotate(this->getRotation()); Mat4 result = parentTrans * thisTrans * translate * rotate; this->setPosition(result.getTranslation()); this->setRotation(result.getRotation()); } 

Esto funciona para un caso de testing algo complejo: un nodo padre con un nodo hijo, el nodo secundario se compensa con el nodo padre, el nodo principal se rota y el nodo secundario tiene su propia rotation local. En este caso, el dibujo parece correcto.

Estoy teniendo problemas al aplicar las anteriores varias veces. Por ejemplo, cuando estoy animando un nodo giratorio (cambiando la rotation solo un poco en cada cuadro). Aquí, la position del nodo se vuelve enorme y simplemente vuelve a una position muy grande.

Cualquier ayuda o consejo sobre cómo abordar esto es muy apreciada.

Parece que estás astackndo cálculos matriciales. Las "fonts de transformación originales del nodo" deben mantenerse prístinas al calcular "nodo en el material gráfico".

Suponiendo que su código original se parece un poco a esto:

 bool haveParent; Node* parent; Mat4 rotation; // or Quat Mat4& getRotation() const { return rotation; } Vec3 position; Vec3& getPosition() const { return position; } Mat4 Node::getTransform() { return getTranslation() * getRotation(); } const Vec3& void Node::update() { Mat4 parentTrans = (this->haveParent ? this->parent->getTransform() : Mat4::Identity()); Mat4 thisTrans = this->getTransform(); Mat4 translate = Mat4::Translation(this->getPosition()); Mat4 rotate(this->getRotation()); Mat4 result = parentTrans * thisTrans * translate * rotate; this->setPosition(result.getTranslation()); this->setRotation(result.getRotation()); } 

Probablemente necesites algo como esto:

 // Assume the attributes are private and the methods are public. Node* mParent; // nullptr on initialization Mat4 mThisNodeRotation; // or Quat Mat4& getThisNodeRotation() const { return mThisNodeRotation; } Vec3 mThisNodePosition; Vec3& getThisNodePosition() const { return mThisNodePosition; } Mat4 mWorldRotation; // Rotation computed with the parent's ancestries Mat4 mWorldPosition; // Translation computed with the parent's ancestries const Mat4& getWorldRotation() const { return mWorldRotation; } void setWorldRotation( const Mat4& aValue ) { mWorldRotation = aValue; } const Vec3& getWorldPosition() const { return mWorldPosition; } void setWorldPosition( const Vec3& aValue ) { mWorldPosition = aValue; } const Mat4& getWorldTransform() const { return mWorldPosition * mWorldRotation; } Mat4 Node::getThisNodeTransform() { return getTranslation() * getThisNodeRotation(); } void Node::update() { Mat4 parentTrans = (this->parent ? this->parent->getWorldTransform() : Mat4::Identity()); Mat4 worldResult = parentTrans * getThisNodePosition() * getThisNodeRotation(); this->setWorldPosition(result.getTranslation()); this->setWorldRotation(result.getRotation()); } 

No he probado el código, pero se ha hecho con casi lo mejor de mi conocimiento.

Al calcular la position final de un nodo, debe mantener un muro entre los datos del nodo y lo que se aplica al gráfico de escena: al calcular la position en el gráfico de escena, no debe cambiar la configuration original del nodo (por supuesto , es la position de la matriz, pero no es necesario modificarla durante la actualización y el cálculo de la location final).

Mis estándares de encoding se han aplicado, por favor, ignórenme ya que me estoy convirtiendo en un viejo mono.

Parece que include thisTrans en el cálculo del result fue incorrecto. El código actualizado es:

 Mat4 result = parentTrans * translate * rotate; 

Gracias a todos los que preguntaron / respondieron otras preguntas relacionadas con la matriz de transformación, ya que fueron muy útiles.