AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Vektor Problem (3D)

Offene Frage von "MR321"
Ein Thema von MR321 · begonnen am 3. Okt 2003 · letzter Beitrag vom 12. Okt 2003
Antwort Antwort
Seite 3 von 3     123
MR321

Registriert seit: 18. Aug 2003
38 Beiträge
 
#21

Re: Vektor Problem (3D)

  Alt 7. Okt 2003, 18:07
Ja, Matrixmultiplikationen kann OpenGL, genauso wie man sie auch auf einem Stack speichern kann. (Und jetzt das beste: Ich weis sogar wie man das macht )
Aber trotzdem muss ich die Werte für die Matrixmultiplikation erstmal rausbekommen. Denn ich hab ja nur die Koordinaten der einzelnen Gelenkpunkte. Und die neuen Koordinaten, wenn sich das Teil bewegt.

Und zum Knochensystem: Mir ist kein anderes System eingfallen, was man zur Animation benutzen könnte.

//Edit: Ach ja, jetzt hab ich doch glatt die Frage vergessen: Wie bekomme ich die Werte für die Matrixmultiplikation? Und da sind wir wieder beim Thema...
Computers are like air conditioners, they stop working immediately, if you open windows.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#22

Re: Vektor Problem (3D)

  Alt 8. Okt 2003, 12:20
Ich glaube, das ist nicht so pauschal zu beantworten. Können die Knochen sich denn beliebig bewegen, oder anders gefragt, wer bewegt sie, wenn nicht du? Können sie NUR gedreht oder bewegt werden oder beides?

Normalerweise bewegst du bereits die Knochen selbst per Matrixmultiplikation, so dass du die Matrix somit automatisch zur Verfügung hast. Also: Wie bewegst du denn nun deine Knochen? Bitte detailliert ;c)
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
MR321

Registriert seit: 18. Aug 2003
38 Beiträge
 
#23

Re: Vektor Problem (3D)

  Alt 8. Okt 2003, 13:37
Meine Knochen werden bewegt, indem man einem Gelenk einfach einen anderen Punkt zuweist. Die Zuweisung betrifft nur das eine Gelenk. Alle untergeordneten Gelenke bleiben an der selben Stelle. Alle übergeordneten auch. Man kann den Gelenken belibige Koordinaten zuweisen.

Die Knochen werden bewegt durch Keyframes, in denen jeweils alle Positionen der Gelenke gespeichert sind. In den Frames dazwischen werden die Gelenke dynamisch berechnet. Also wir haben die aktuellen Knochenpostitionen für den aktuellen Frame vorliegen (Habe ich sogar selbst geschafft zu berechnen ).

Aber mal ne Frage so nebenbei: Wie würde man das ganze mit Matrixmultiplikationen machen? Also so, dass es auch hinterher anwenderfreundlich ist.
Computers are like air conditioners, they stop working immediately, if you open windows.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#24

Re: Vektor Problem (3D)

  Alt 10. Okt 2003, 16:29
Du setzt die Transformationsmatrix als Weltmatrix und renderst einfach die betreffenden Vertices, Rest erledigt 3D-Api bzw. Grafikkarte ;c)

Ich würde dir empfehlen, einfach die Punkte in Matrizen umzurechnen. Wie ich weiter oben schon erwähnte, bekommst du den Winkel (und somit die Rotation) über das Skalarprodukt und die Translation kannste ja direkt ausrechnen, davon ausgehend, dass du für jeden Knochen zwei Punkte hast (nämlich seinen Startpunkt und den Startpunkt des nächsten). Aus dem Winkel errechnest du die Rotationsmatrix und aus der Translation halt die Translationsmatrix, und dann multiplizierst du die beiden (aber bitte in der richtigen Reihenfolge, die ich gerade nicht im Kopf habe ) und setzt sie als Weltmatrix. Bei D3D also IDirect3DDevice9::SetTransform(D3DTS_WORLDMATRIX, &Matrix) oder so. Und dann renderst du die Vertices, die zu dem Knochen gehören -> Grafikkarte transformiert sie alle so wie den Knochen. Die Transformationsmatrizen berechnen kannst du z.B. mit den D3DXMatrixTranslation und D3DXMatrixRotationAxis Funktionen, im DirectX SDK steht aber auch, wie du die Matrizen ganz einfach von Hand berechnest. In dem Artikel, zu dem ich oben verlinkt habe, glaube ich auch ;c)
Ach, und ich glaube, eine Skalierung ist nicht mit dieser Methode zu erkennen -> einfacher wäre die Speicherung mit Matrizen wie z.B. das X-Format es macht.

So, und was meinst du jetzt mit ANWENDERFREUNDLICH? ;c)
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
MR321

Registriert seit: 18. Aug 2003
38 Beiträge
 
#25

Re: Vektor Problem (3D)

  Alt 11. Okt 2003, 10:16
Ich arbeite mit OpenGL. Aber dort kenne ich die Befehle dafür.
Delphi-Quellcode:
glTranslate3f(X,Y,Z); // Verschieben
glRotate4f(Winkel,1,0,0) // Um X-Achse drehen
glRotate4f(Winkel,0,1,0) // Um Y-Achse drehen
glRotate4f(Winkel,0,0,1) // Um Z-Achse drehen
OK, und wie genau berechne ich das jetzt? Nehmen wir an ich habe jetzt den Punkt vom übergeordneten Gelenk: P1neu. Und den vom untergeordneten suche ich: P2neu. Und die Grundposition von den beiden: P1alt,P2alt habe ich auch.
Wie berechne ich das nun?

[edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit]
Computers are like air conditioners, they stop working immediately, if you open windows.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#26

Re: Vektor Problem (3D)

  Alt 11. Okt 2003, 13:32
Tja, das ist halt das Problem. Wenn du aus deinen zwei Vektoren drei Winkel berechnen willst, ist das nicht ganz einfach.
Ich habe oben schon eine einfachere Methode beschrieben, die ich daher empfehlen würde: Den Winkel per Skalarprodukt berechnen, per Kreuzprodukt eine zur Rotationsbewegung senkrechte Achse berechnen und dann eine Matrix erzeugen bzw. eine Drehung ausführen, die um den Winkel um die berechnete Achse dreht. In D3D nimmste da halt einfach D3DXMatrixRotationAxis, unter OpenGL weiß ich nicht ob es da ein direktes Äquivalent gibt, und wie gesagt, ist es nicht ganz einfach, wenn auch nicht unmöglich, es mit drei Winkeln zu machen.

Dazu musst du halt neue Vektoren erzeugen, für jede achsenparellele Ebene einen (also für die xy-Ebene, indem du die Z-Koordinate auf 0 setzt). Jetzt berechnest du innerhalb dieser Ebene den Winkel zwischen den Vektoren per Skalarprodukt, und das machst du für die anderen Ebenen auch. Dadurch bekommst du deine drei Winkel. Naja, die Translation ist dann ja wieder trivial, einfach den alten Anfangspunkt des Knochens vom neuen Anfangspunkt subtrahieren. Leider landest du damit wiederum beim noch weiter oben von mir erwähnten Gimbal-Lock-Problem, das aber für deine Animationen vermutlich nicht so drastisch ist.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
MR321

Registriert seit: 18. Aug 2003
38 Beiträge
 
#27

Re: Vektor Problem (3D)

  Alt 11. Okt 2003, 14:43
Bahnhof!
Ich habe nicht den blassesten Schimmer wovon du da gerade redest.
Kannst du das auch irgendwie als Formeln aufschreiben, die ich dann in Delphi auch benutzen kann?

(Oder falls du keine Lösung findest eine Alternative, die besser zu meinem jetzigen Animationssystem ist...)

//Edit: Man kann auch in OpenGL direkt eine Matrix eingeben, mit der man die aktuelle Matrix multipliziert.
Computers are like air conditioners, they stop working immediately, if you open windows.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#28

Re: Vektor Problem (3D)

  Alt 12. Okt 2003, 15:15
Aber OpenGL bietet meines Wissens keine Funktion, die eine Matrix erzeugt, die eine Rotation um eine beliebige Achse durchführt! Das wäre daher von Hand zu erledigen, wiederum nicht ganz trivial.

Die Alternative zu deinem Animationssystem (abgesehen von der Möglichkeit, die Matrizen mit den Vertexdaten zu speichern) liegt doch auf der Hand: Anstatt Knochen-Keyframes zu speichern, speicherst du Keyframes des gesamten Models. Macht zum Beispiel Quake 3 so. Dann schenkst du dir den ganzen Knochenkram, der ohne analytische Geometrie wie du siehst nicht ganz einfach ist. Da das sehr aufwändig ist, werde ich dir auch keine fertigen Formeln geben (weil ich keine hab' (c; ), so dass du entweder die Formeln selbst erarbeiten musst (der Link oben von mir gibt da wie gesagt reichlich Hilfe, ebenso jede mathematische Formelsammlung), ein vorgefertigtes Animationssystem verwendest (wie z.B. das md3-Format oder das X-Format, die du überall erklärt findest) oder dir ein eigenes neues überlegst. Ansonsten, wenn du es weiterhin so machen willst wie bisher, dann:

Lerne was ein Skalarprodukt ist.
Lerne was ein Kreuzprodukt ist.

Mit etwas Nachdenken kommst du dann schon zu den Formeln, aber diese beiden Teile sind so elementar, dass keine 3D-Engine ohne auskommt. Selbst wenn du sie nicht aktiv benutzt, denn z.B. die Lichtberechnung ist nichts weiter als ein Skalarprodukt des Lichtvektors mit dem Normalenvektor der Oberfläche.

Weil du's bist, gebe ich dir nochmal den Link: http://www.jtl-software.de/3d_grund.html
Da steht was ein Kreuzprodukt ist, was ein Skalarprodukt ist und wie du einfache Matrizen erzeugst. Und es ist auch für jemanden verständlich, der von Tuten und Blasen (oder vielmehr Vektoren) keinen blassen Schimmer hat. Also bitte ich dich nochmal, lies diesen Text durch, verstehe ihn und dann kannst du wiederkommen
Es steht wirklich alles drin, was du für die besagten drei Drehwinkel brauchst, wie ich es etwas weiter oben beschrieben habe, aber ohne diese Grundbegriffe werde ich es dir kaum näher erklären können.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz