Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

11

07.11.2006, 21:07

dann müsste ich aber im Vertexshader zwei Matrizen multiplizieren

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

07.11.2006, 21:57

^^, nein.
du musst nur die position erst mit der einen matrix und dann mit der andren transformieren.

also zuerst mit der jointmatrix und dann das ergebnis mit der ViewProjectionMatrix...

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

13

08.11.2006, 12:27

Das ist an sich ne gute Idee

Nur, die Vertices speicher ich ja relativ zu ihrem Joint. D.h. ich muss sie im Vertex-Shader zurück zum Modellursprung transformieren (also auch translieren).

Würde ich die Vertices von Anfang an absolut (also relativ zum Modellurprung) speichern, wäre die Rotationen der Joints natürlich nicht mehr korrekt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

08.11.2006, 13:44

du transformierst jeden vertex beim laden mit der inversen der absoluten (Worldspace) matrix seines joints.

die jointmatrix die du an den shader übergibst, muss halt die ABSOLUTE matrix sein (also interpolierte relative matrix * parent.absolute).

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

15

08.11.2006, 16:14

ich verstehe dich leider immer noch nicht. Vielleicht meinen wir auch immer verschiedene Matrizen.

Also noch mal ganz von vorne:
-Es gibt eine WorldViewProjection-Matrix die ganze Objekt transformiert.

-Wenn ich von einem transformierten Joint spreche, meine ich einen Joint der von seinem Parent transformiert wurde, und das Parent wiederrum von seinem Parent usw.

-Desweitern hat jeder Joint eine RELATIVE Matrix, die seine Vertices dann richtig transformiert, wenn sie (die Vertices) relativ zum Ursprung des transformierten Parent-Joints gespeichert sind. DIESE Matrix kann auch eine 3x3 Matrix sein, weil sie wohl nur in den seltensten Fällen Translation durchführt.

Nun speichere ich meine Vertices aber nicht relativ zum transformierten Parent-Joint, sondern relativ zum transformierten (Normal-)Joint.

So, vor dem Rendern transformiere ich dann alle Joints. Den ersten Joint (also den ohne Parent) transformiere ich mit der WorldViewProjection-Matrix.

Im Shader transformiere ich dann alle Vertices mit der jeweiligen Matrix des jewiligen transformierten Jointes.

@dot: Vielleicht kannst du nochmal in meinen Worten erläutern was du meinst

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

08.11.2006, 18:09

Zitat

So, vor dem Rendern transformiere ich dann alle Joints. Den ersten Joint (also den ohne Parent) transformiere ich mit der WorldViewProjection-Matrix.


NEIN! ;)

du speicherst alle vertices realtiv zu "ihren" joints (das machst du, indem du alle vertices beim laden mit der inversen der ABSOLUTEN matrix ihres joints transformierst).

so, nun berechnest du die neue jointmatrix aus den interpolierten keyframe daten und bildest für jeden joint die absolute matrix davon.

im vertexshader gehst du her und transformiertst jeden vertex erstmal mit dieser neuen absoluten matrix seines joints.

und das was da rauskommt transformierst du mit der WorldViewProjection Matrix...

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

17

08.11.2006, 23:38

So weit alles nur nur die absolute Jointmatrix beinhaltet natürlich auch Translation.

Denn wenn ich wagen wir mal einen Arm mit der inversen absoluten Jointmatrix transformiere, befindet er sich ja relativ zum Objektursprung.

Ich will ihn aber an der Schulter haben und da kann ich den drehen wie ich will der bleibt immer in der Nähe vom Objektursprung

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

09.11.2006, 10:57

Zitat von »"dot"«

wenn du deine joints insofern limitierst, dass diese nur rotiert und verschoben werden können (was im allgemeinen reichen sollte, bei characteranimation sollte es sogar reichen nur zu rotieren).

damit kannst du zum transformieren der position ganz normal die matrix und für die normalen nur den 3x3 teil der matrix nehmen und brauchst nurmehr eine matrix (4 register).


sry, ich habe mich da wirklich FALSCH ausgedrückt.

natürlich brauchst du die translation (zumindest für die "abstände" der joints untereinander).
was ich damit sagen wollte ist: wenn du nur translation und rotation hast, ist der 3x3 teil der matrix orthogonal und du kannst damit deine richtungsvektoren transformieren und mit dem 4x4 teil die position...

Quellcode

1
2
3
4
m4x4 r0, v0, c[a0.x+10]  //position, c[a0.x+1] = Joint Matrix
m3x3 r1, v1, c[a0.x+10]  //normalvektor

m4x4 oPos, r0, c0  //c0 WorldViewProjection Matrix

lumpinus

Frischling

  • »lumpinus« ist der Autor dieses Themas

Beiträge: 27

Wohnort: Bad Münstereifel

  • Private Nachricht senden

19

09.11.2006, 11:43

Quellcode

1
2
3
4
m4x4 r0, v0, c[a0.x+10]  //position, c[a0.x+1] = Joint Matrix
m3x3 r1, v1, c[a0.x+10]  //normalvektor

m4x4 oPos, r0, c0  //c0 WorldViewProjection Matrix


Toll, jetzt hab ja doch wieder zwei 4x4 Matrizen, jedenfalls für die Position. 8) Da kann ich ja gleich die Joint-Matrix mit der WorldViewProjection Matrix vor dem Rendern transformieren.

Zwar kann ich dann keine Normalvektoren mehr transformieren (im Shader) aber das mach ich eh nicht weil ich stattdessen alle Lichtquellen in das Objektkoordinatensystem transformiere.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

09.11.2006, 12:00

Zitat

Toll, jetzt hab ja doch wieder zwei 4x4 Matrizen, jedenfalls für die Position. Cool Da kann ich ja gleich die Joint-Matrix mit der WorldViewProjection Matrix vor dem Rendern transformieren.

Zwar kann ich dann keine Normalvektoren mehr transformieren (im Shader) aber das mach ich eh nicht weil ich stattdessen alle Lichtquellen in das Objektkoordinatensystem transformiere.


du hast EINE 4x4 matrix PRO joint und EINE WorldViewProjection Matrix aber die nur EINMAL!?

du müsstest die lichtquellen in das koordinatensystem JEDES joints transformieren damit das funzt -> zusätzliches register pro joint und lichtquelle...

Werbeanzeige