Objekt Matrix mit ungleichmäßiger Skalierung

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Objekt Matrix mit ungleichmäßiger Skalierung

Beitrag von Zudomon »

Hi!
Ich habe ein Problem mit Matrizen. Es geht um die Objektmatrix, damals hatte ich zwei dafür benutzt, eine für die Transformation und eine für die Normalen. Das mache ich nun schon ewig nicht mehr. Nun habe ich allerdings das Problem, das ich ungleichmäßigen Skalierungen benötige. Wenn man z.B. eine Skalierung in 1 2 1 durchführt, also in Y-Achse verdoppelt, so müssten die Normalen um 1 0.5 1 skaliert werden, wenn ich mich nicht täusche. Meine Frage nun, kann man das ganze mit einer einzigen Matrix lösen, oder muss ich dafür wieder auf die zwei Matrizen Lösung von damals zurückgreifen?

Gruß
Zudo
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Objekt Matrix mit ungleichmäßiger Skalierung

Beitrag von Jörg »

Für die Normalen nimmst Du einfach die Inverse und Transponierte Matrix (ohne Verschiebungsanteil).
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Objekt Matrix mit ungleichmäßiger Skalierung

Beitrag von Zudomon »

Ohne Verschiebung heißt ja, dass man dann eine 3x3 Matrix hat. Dachte eigentlich, das man durch transponieren einer 3x3 Matrix die Inverse bekommt. Aber scheinbar gibt es da noch einen Unterschied. "transpose" ist ja der Shaderbefehl zum Transponieren. Gibt es sowas auch für die Inverse?
Man könnte natürlich auch einfach die Inverse an den Shader übergeben, aber vielleicht lässt sich das ja vermeiden :D
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Objekt Matrix mit ungleichmäßiger Skalierung

Beitrag von Schrompf »

erstmal: die korrekte umkehroperation ist immer die invertierung. die kannst du auch im shader berechnen, aber das ist ordentlich rechenaufwand. schau z.b. mal in die assimp-sourcen - dort findest du die invertierung für 3x3- und 4x4-matrizen ausformuliert, und die funktionen sind länglich. ich tipp mal so auf 60 bis 100 mathe-ops, wenn du den code vektorisiert bekommst, sonst eher 400 skalare ops. besser vorher invertieren. die grundlagen zur invertierung findest du in der "matrix&quaternion-faq" - google kennt die. da unbedingt auf die version achten, die letzte ist von 2003, frühere haben fehler.

die transponierung geht sehr viel schneller... im falle der shader-mathematik ist es sogar nur eine uminterpretation, die nächste matrix-mul wird dann halt eine serie mad() anstatt dot4(). leider ist die transponierung nur dann ein ersatz für die invertierung, wenn die matrix bestimmte bedingungen erfüllt. sie muss "orthonormiert" sein. d.h. die basisvektoren der matrix müssen senkrecht zueinander sein ("ortho") und einheitslänge haben ("normiert"). daran erkennt man bereits, welche matrizen man schön transponieren kann und welche man aufwändig invertieren muss. Rotationen und Spiegelungen kann man transponieren, aber Skalierungen und theoretisch auch Translationen muss man invertieren. Wobei es für die gängigen homogenen Matrizen aus Rotation und Translation eine verkürzte version gibt, die mit etwas weniger rechenzeit auskommt.

für dich mit den nicht-uniformen skalierungen gibt's leider keinen schönen trick :-) du wirst sowohl die normale also auch die invertiert transponierte version hochladen müssen, oder die Skalierung separat durchführen müssen, um die trafo-matrix davon freizuhalten.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Objekt Matrix mit ungleichmäßiger Skalierung

Beitrag von Zudomon »

Danke für die ausführliche Antwort!
Okay, dann werd ich die Invertiertung im Shader natürlich lassen, wäre ja verschwendung, da ist dann besser, einfach ne invertierte+transponierte Matrix direkt mit zu übergeben. Ich benutze die Invertierung, die DX da zur Verfügung stellt.
Funktioniert auch jetzt richtig, dank eurer Hilfe! :D
Antworten