[ASSIMP] Normierung von Quaternionen

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

[ASSIMP] Normierung von Quaternionen

Beitrag von CodingCat »

Das neue PhysX SDK (3.2) verhält sich sehr vorbildlich bei der Validierung von Daten. So bin ich aufgrund neuerlicher Crashes meines Import-Tools (fehlgeschlagene PhysX Assertions) darauf gestoßen, dass aiMatrix4x4::decompose() gar keine normierten Quaternionen liefert. Das könnte der Grund für eine Vielzahl von Problemen sein, die ich im letzten Jahr mit PhysX hatte (vor meinem Bug Report zu Mesh Scaling war PhysX selbst jedoch an einigen Stellen so buggy, dass ich den Fehler bis gerade eben nie vernünftig lokalisieren konnte). Deshalb die Frage: Ist das so gewollt?

Obendrein hat sich wohl leider ein grober Bug in die aiQuaternion::Normalize()-Funktion eingeschlichen, dessen bisherige Unbemerktheit schon äußerst überraschend ist: :mrgreen:

Code: Alles auswählen

inline aiQuaternion& aiQuaternion::Normalize()
{
	// compute the magnitude and divide through it
	const float mag = x*x+y*y+z*z+w*w;
	// BUG: mag ist Betrag zum Quadrat, Quadratwurzel fehlt
	if (mag)
	{
		x /= mag;
		y /= mag;
		z /= mag;
		w /= mag;
	}
	return *this;
}
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [ASSIMP] Normierung von Quaternionen

Beitrag von dot »

Eine kleine Optimierung wäre hier potentiell auch, die Division der einzelnen Komponenten durch eine Multiplikation mit dem Kehrwert zu ersetzen, da der Compiler (zumindest MSVC unter /fp:precise) in der Regel diese Transformation afaik nicht vornehmen darf.
Benutzeravatar
Schrompf
Moderator
Beiträge: 5161
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [ASSIMP] Normierung von Quaternionen

Beitrag von Schrompf »

Also der aktuelle Code dazu sieht so aus:

Code: Alles auswählen

template<typename TReal>
inline aiQuaterniont<TReal>& aiQuaterniont<TReal>::Normalize()
{
	// compute the magnitude and divide through it
	const TReal mag = sqrt(x*x + y*y + z*z + w*w);
	if (mag)
	{
		const TReal invMag = static_cast<TReal>(1.0)/mag;
		x *= invMag;
		y *= invMag;
		z *= invMag;
		w *= invMag;
	}
	return *this;
}
Man könnte noch die Wurzel ins if() reinziehen, aber da ich Null-Quaterions für unwahrscheinlich halte, ist das nur müßige Überlegung. Mit welcher Assimp-Version arbeitest Du?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [ASSIMP] Normierung von Quaternionen

Beitrag von CodingCat »

2.0 Revision 863 laut revision.h (letzte offizielle Veröffentlichung?). Wenn das inzwischen gefixt ist, umso besser. Wie das dann jetzt mit decompose() ausschaut, muss ich erst nachsehen.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [ASSIMP] Normierung von Quaternionen

Beitrag von Krishty »

dot hat geschrieben:Eine kleine Optimierung wäre hier potentiell auch, die Division der einzelnen Komponenten durch eine Multiplikation mit dem Kehrwert zu ersetzen, da der Compiler (zumindest MSVC unter /fp:precise) in der Regel diese Transformation afaik nicht vornehmen darf.
Mit gutem Grund – man liegt halt meist mindestens ein ULP daneben. Dann rechnet man das Quaternion zur Matrix um, dann die Matrix zu Euler-Winkeln, und schon kracht es weil acos(1.000001f) berechnet werden soll – oder es kracht genau nicht.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten