Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 04:01

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Mo Feb 06, 2006 16:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

hab mal wieder ein Mathematisches problem.. :)

Geht um Matritzen zur bewegung von Punkten.. an und für sich hab ich das zwar schonmal gefragt, nur diesmal brauch ich eine andere lösung.

Ich habe einen Punkt/Vertex (X,Y,Z) und 5 Matritzen. Die Matritzen haben alle verschiedenen einfluss auf den Punkt.. (á la Skelett/Bone Animation)

Bisher habe ich das immer so gelöst das ich jede einzelne Matrix nach und nach mit ihrem weighting auf den Punkt addiert habe.. geht auch wunderbar :)

Aaaaber.. gibt es eine möglichkeit aus den 5 Matritzen eine einzige rauszurechnen die ich dann auf den punkt anwenden kann???

sowas in der art:
newMatrix = Matrix1 * 0.2 + Matrix2 * 0.4 + Matrix3 * 0.1 + Matrix4 * 0.2 + Matrix5 * 0.1
(Alle weightings zusammen ergeben immer 1.0)

Geht sowas??

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 06, 2006 17:22 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Also ich bin mir nicht so ganz sicher worauf Du hinauswillst. Aber anscheinend hast du mehrere Matrizen, die du zusammen verwenden möchtest und die in verschiedenen Reihenfolge zu "teilen" auf deine Punkte angewendet werden. Sofern es sich bei deinen Matrizen um Drehmatrizen handelt, kannst du sie einfach in Quaternionen umrechnen, dort sie nur anteilhaft drehen (bestehen aus drehwinkel, drehachse), zusammenrechnen und wieder in Matrizen verwandeln. Aber ob das wirklich das ist, was du erfragen wolltest?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 06, 2006 17:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

hum.. ja, wohl ein wenig komisch ausgedrückt :)

Also, im grunde genommen möchte ich eine Bone-Animation berechnen. Mein Objekt wird von 5 Bones deformiert.
Bedingt durch weightPainting etc hat jeder Bone einen gewissen einfluss auf die einzelnen Vertices des Objektes.

Und ich möchte jetzt ausrechnen wohin jeder Vertex durch die bones bewegt wird.

Sprich, wenn wir es mal auf 2 Bones verringern (Vertex ist auf 0,0,0):
Bone1 bewegt um 10 auf der X Achse
Bone2 bewegt um 5 auf der Y Achse

= Vertex ist auf XYZ: 10, 5, 0

Wenn jetzt Bone1 zu 20% und Bone2 zu 80% einfluss haben wäre der Vertex bei 2, 4, 0.

So, was ich jetzt brauche ist eine Matrix die mir meinen Vertex von 0,0,0 -> 2,4,0 verschiebt (in diesem Beispiel).

Sprich, eine Matrix die sich aus allen Bone-Matritzen und deren weighting errechnet (wobei die Bones auch rotiert sind, nicht nur translated).

Au'revoir,
Aya~

PS: Falls deine Antwort oben immernoch auf das problem passt, magst du das dann nochmal erklären?? *grinst verlegen*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 06, 2006 20:48 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
Sollst du nicht nur den vertex mit jeder matrix multipliceren und dann die neuen vertex'en multipliceren mit der weightings und zuletzt jeder neue produkte addieren?

diesem weg wird der vertex beiden rotiert und translated


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 06, 2006 21:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
JSoftware hat geschrieben:
Sollst du nicht nur den vertex mit jeder matrix multipliceren und dann die neuen vertex'en multipliceren mit der weightings und zuletzt jeder neue produkte addieren?

Ja sicher ^^ So mache ich es ja normal auch.. nur brauche ich in diesem fall diesmal eine einzige Matrix.. den Vertex mit jeder matrix multiplizieren geht leider nicht :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 06, 2006 22:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Ich bekomm's net hin.. *seufzt*
ich dachte zwischenzeitig ich hätte es geschafft... aber dann andere konstellation der joints und.. wieder ging's net :(

Gibt es keine möglichkeit das ohne Quaternionen auszurechnen??

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 07, 2006 06:50 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
Wenn du eines matrix finden muss dann nein. Du muss dann quaternions brauchen. Du kann doch auch zu angle/axis konvertieren und davon rechnet das matrix aber das is schwerer


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 07, 2006 07:30 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
JSoftware hat geschrieben:
Du kann doch auch zu angle/axis konvertieren und davon rechnet das matrix aber das is schwerer

Aber Quaternionen von Rotationen sind doch genau Achsen + Winkel. Denn das Quaternion hat dann die Form:
cos(alpha/2) + sin(alpha/2) * P, wo P Quaternion der Form:
|P| = 1, P = ai + bj +ck, wo a,b,c die Drehachse darstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 07, 2006 11:37 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
Sind Sie alles sicher das ist richtig? Dann muss ich mein matrix unit ein bischen umschreiben :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 07, 2006 18:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

also muß ich wohl Quaternionen rechnen... könnt ihr mir denn sagen ob das hier von der logik richtig ist?? (Auf meine Ausgangsmatrix sollen 3 matritzen mit verschiedener gewichtung hinzugefügt werden)

Code:
  1. Ausgangsmatrix -> QuaternionA
  2. Matrix1 -> Quaternion1
  3. Quaternion1.x = Quaternion1.x * 0.2
  4. Quaternion1.y = Quaternion1.y * 0.2
  5. Quaternion1.z = Quaternion1.z * 0.2
  6. Quaternion1.w = Quaternion1.w * 0.2
  7. QuaternionA = QuaternionA * Quaternion1
  8.  
  9. Matrix2 -> Quaternion2
  10. Quaternion2.x = Quaternion2.x * 0.5
  11. Quaternion2.y = Quaternion2.y * 0.5
  12. Quaternion2.z = Quaternion2.z * 0.5
  13. Quaternion2.w = Quaternion2.w * 0.5
  14. QuaternionA = QuaternionA * Quaternion2
  15.  
  16. Matrix3 -> Quaternion3
  17. Quaternion3.x = Quaternion3.x * 0.3
  18. Quaternion3.y = Quaternion3.y * 0.3
  19. Quaternion3.z = Quaternion3.z * 0.3
  20. Quaternion3.w = Quaternion3.w * 0.3
  21. QuaternionA = QuaternionA * Quaternion3
  22.  
  23. QuaternionA -> zMatrix
  24. zMatrix[0,3] = zMatrix[0,3] + Matrix1[0,3] * 0.2 + Matrix2[0,3] * 0.5 + Matrix3[0,3] * 0.3
  25. zMatrix[1,3] = zMatrix[1,3] + Matrix1[1,3] * 0.2 + Matrix2[1,3] * 0.5 + Matrix3[1,3] * 0.3
  26. zMatrix[2,3] = zMatrix[2,3] + Matrix1[2,3] * 0.2 + Matrix2[2,3] * 0.5 + Matrix3[2,3] * 0.3
  27.  
  28. FertigeEndMatrix = zMatrix


Ist das soweit von der theorie her richtig??

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 07, 2006 19:01 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
Das Weg will es nicht correct werden. Sie müssen Slerp'en oder Nlerp'en mit das Ausgangsmatrixquaternion für das rotation richtig zu geben.

Ich glaube das sie dann die interpolierte quaternions zum matrix konvertieren müssen und dann alle matrix multiplikieren müssen, das letzte matrix zu geben. Aber ich bin nicht davon sicher


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 07, 2006 19:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

hmm... ok.. Also Slerp'e ich die ganzen Quaternions und wandle sie dann wieder zurück.

So richtig??

Code:
  1. AusgangsMatrix = aQuat
  2.  
  3. Matrix1 -> Quaternion1
  4. Quaternion1.Slerp(aQuat, 0.2);
  5. Quaternion1 -> zMatrix1;
  6.  
  7. Matrix2 -> Quaternion2
  8. Quaternion2.Slerp(aQuat, 0.5);
  9. Quaternion2 -> zMatrix2;
  10.  
  11. Matrix3 -> Quaternion3
  12. Quaternion3.Slerp(aQuat, 0.3);
  13. Quaternion3 -> zMatrix3;
  14.  
  15. zMatrix = AusgangsMatrix * Matrix1 * Matrix2 * Matrix3
  16.  
  17. zMatrix[0,3] = AusgangsMatrix[0,3] + Matrix1[0,3] * 0.2 + Matrix2[0,3] * 0.5 + Matrix3[0,3] * 0.3
  18. zMatrix[1,3] = AusgangsMatrix[1,3] + Matrix1[1,3] * 0.2 + Matrix2[1,3] * 0.5 + Matrix3[1,3] * 0.3
  19. zMatrix[2,3] = AusgangsMatrix[2,3] + Matrix1[2,3] * 0.2 + Matrix2[2,3] * 0.5 + Matrix3[2,3] * 0.3
  20.  
  21. FertigeEndMatrix = zMatrix


Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 07, 2006 20:33 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
das sieht richtig aus. aber du darfst nicht mit das ausgangsmatrix auch multiplikeren

zMatrix = Matrix1 * Matrix2 * Matrix3


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 07, 2006 20:49 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

hm... ok, soweit ist's dann klar.. :)
Nuuur, hab doch noch nen anderes problem... ich kann am ende nicht alle matritzen miteinander multiplizieren.

Das ganze sieht bei mir in etwa so aus:

Code:
  1. procedure applyMatrix(var BaseMatrix, Matrix: TMatrix; t: Double)
  2. begin
  3.   //Pseudocode ^^
  4.   BaseMatrix -> BaseQuaternion
  5.   Matrix -> MatrixQuaternion
  6.   Q = Slerp(BaseQuaternion, MatrixQuaternion, t);
  7.   Q -> zMatrix;
  8.  
  9.   zMatrix[0,3]:=BaseMatrix[0,3] + Matrix[0,3] * t;
  10.   zMatrix[1,3]:=BaseMatrix[1,3] + Matrix[1,3] * t;
  11.   zMatrix[2,3]:=BaseMatrix[2,3] + Matrix[2,3] * t;
  12.  
  13.   BaseMatrix:=zMatrix;
  14. end;
  15.  
  16. //Irgendwo im Programm:
  17. base:=IdentityMatrix;
  18. applyMatrix(base, Matrix1, 0.2);
  19. applyMatrix(base, Matrix2, 0.5);
  20. applyMatrix(base, Matrix3, 0.3);
  21. //Jetzt sollte base das machen, was alle 3 Matritzen machen würden :)


Ich kann leider nichts daran ändern das es eine funktion ist die aufgerufen wird (ist nen PlugIn).. deswegen, geht das trotzdem???

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 07, 2006 21:05 
Offline
DGL Member

Registriert: Di Sep 06, 2005 20:40
Beiträge: 26
Wohnort: Aarhus, Denmark
Q = Slerp(BaseQuaternion, MatrixQuaternion, t);

ich weiss doch nicht wie sie implementiert der slerp function aber mit mein implemtation wird die richtige notation
Q = Slerp(MatrixQuaternion, BaseQuaternion, t);
aber ich habe ein kleines gedank sagend mir das mein slerp implementation sind falsch.

ich kann nicht alles klar in moment denken(oder schreiben) vieleicht müssen sie ein billinear lerp mit die translation part brauchen aber es sieht richtig aus für mich jetzt


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 31 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]