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

Aktuelle Zeit: Fr Jul 18, 2025 04:32

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Fr Jan 13, 2006 23:17 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hallo,

ich suche nach einer Möglichkeit per Animation in OpenGL von einer Modelview Martix A zu einer Modelview Matrix B überzublenden.

Wie kann ich die Matix AB berechnen die mir in Abhängigkeit vom aktuellen Scheifenzähler und der Anzahl von Steps (z.B. 10) einen Fadeeffekt bringt, der mit der Matrix A startet und mit B endet?

Irgendwelche Ideen?

Grüße
User69


Zuletzt geändert von user69 am Mi Jan 18, 2006 23:04, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 15, 2006 01:15 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Fadeeffekt? Einfach nur Blenden wie in einer Diashow, oder die Kamera bewegen?

Wenn du ersteres meinst, dann:

Matrix1-> Ausgabe in eine Textur rendern.

Matrix2->laden und darstellen. Matrix1-Textur auf ein Quad und drüber legen.

Quad langsam per Blending durchsichtig machen, bis es endlich weg ist.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 15, 2006 01:24 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Eine einfache Möglichkeit ist den Punkt mit beiden Matrizen zu transformieren und dann zwischen den Ergebnissen linear zu interpolieren. Dafür gibt's auch eine Extension ARB_vertex_blend oder eben im Vertex Shader. Das funktioniert aber nur bei kleinen Drehungen.

Ansonsten die Matrizen jeweils in Rotation & Verschiebung aufteilen, getrennt interpolieren und nacher wieder zusammensetzen. Die Rotation ist die obere 3x3 Matrix und der Verschiebungsvektor sind die oberen 3 Werte der letzten Spalte. (im Normalfall)
Die Rotationen jeweils in Quaternionen konvertieren, dazwischen interpolieren und dann das Quaternion wieder in eine Rotationsmatrix konvertieren. Den Verschiebungsanteil kann man einfach linear interpolieren.
Formeln für die Umrechnung zwischen Rotationsmatrizen und Quaterionen sowie die Interpolation sind in vielen Formelsammlungen z.B. "Matrix and Quaternion FAQ".


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 15, 2006 10:44 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hi Lars,

Danke für die Antwort. Das war was ich suchte.

Ich werde also erst mal die einfach lineare Interpolation probieren und mir die Ergebnisse anschauen.
Wenn das nicht so toll aussieht muß ich halt dann den den etwas aufwendigeren Weg mit der Zerlegung der Matritzen gehn.

Hat jemand diese 2 Wege schon mal probiert?
Mit welchen Ergebnissen ist zu rechnen - gibt die die einfache Interpoation schon gute Ergebnisse oder sollte man diesen Weg lieber gleich verwerfen?

User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 15, 2006 14:21 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Ich hab beides mal probiert und es hängt sehr davon ab, was du machst. Ich hab das gebraucht, um bei Animationen von Modellen (mit skeletaler Animation) zwischen den Frames zu interpolieren. Wenn die Anzahl der Frames recht hoch und somit der Unterschied dazwischen sehr klein ist (wie z.B. bei den Doom3 Modellen) dann reicht die einfache Methode voll und ganz. Wenn aber zwischen den Frames ein großer Unterscheid ist, also Drehnungen von mehr als 40° - 50°, wie man es manchmal bei Milkshape-Dateien hat, dann kommt man um die Quaternionenmethode nicht drum herum.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 15, 2006 15:49 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Es muß universell für jede Matrix funktionieren.
Also sind Rotationen bis 180° nöglich.
Ich muß mich demzufolge nun in die Quaterionen reinlesen.
Danke für Eure Hinweise, ich denke nun weiß ich die Richtung und den Weg werde ich dann wohl finden.

User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 18, 2006 23:12 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hallo,

hat jemand evtl einen Delphi Code für: MatrixToQuaternion?

Die restlichen Funktionen wie QuaternionToMatrix, QuaternionSlerp .. sind ja in der Geomety.pas Unit von Mike Lischke drin. Lieder fehl aber genau MatrixToQuaternion.

Im Internet kursieren verschiedene Berechnungen: aus Matrix and Quaternion FAQ oder auch ein recht umfangreicher Beitrag zu Quaternions auf www.Gamasutra.com.
Meineserachtens unterscheiden sich aber beide Codes und ich weiß leider nicht, ob beide zu einem guten Ergebnis führen.

Wenn jemand einen zuverlässigen Code für MatrixToQuaternion (möglichst sogar in Delphi) hat wärs schön, wenn der hier gepostet würde.

Besten Dank
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 19, 2006 21:41 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hallo,

habs doch im Internet gefunden und in Delphi umgesetzt.
Scheint recht gut zu funktionieren.

Interpolation Animation sieht toll aus.

Grüße
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 19, 2006 23:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ein Link auf solcherlei Sachen wäre toll. Wenns mal jemand anderes sucht.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 19, 2006 23:13 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Wenn mans leicht verständlich möchte und schnell in der Anwendung, werfe einen Blick in die Wikipedia:
http://de.wikipedia.org/wiki/Quaternion ... aternionen

Naja, wenn das Quaternion dann hat, dann ist der Rest nicht weiter schwer denke ich. Dazu aber vorher den Abschnitt über Drehungen lesen


Zuletzt geändert von Delphic am Mo Jul 13, 2009 07:54, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 20, 2006 19:46 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Hi,

recht viele infos (Matrix allgemein + Quaternion) gibts auf
http://www.euclideanspace.com/maths/geo ... nversions/

Dann fand ich noch die unit geometry.pas von Mike Lische ganz gut.

Die quaternion SLERP (spherical linear interpolation) funktion funktionierte nur nach keinen Abwandlungen:
costheta:= VectorAngle.... gibt leider nan für die Identity Quaternion. Abhilfe schaft die Nutzung des DOTProduktes anstelle dessen.

Grüße
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 14, 2007 18:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Ich möchte hier mal Totenbeschwörung betreiben :twisted:
Ich arbeite auch grad daran, zwischen zwei Matrizen zu faden. Auf mehrfache Empfehlung greife ich inzwischen auf Quaternionen zurück. Das Problem ist nun, dass es in manchen Fällen tut, in anderen wiederum sieht man während der Animation gar nichts. Ich kann nur sagen, dass die Ausgangs- und Endmatrix stimmen, weil wenn ich nur die Werte der Matrizen linear interpoliere, dann geht es "korrekt" (sieht halt besch*ssen aus).
Dem System nach mache ich es, wie es Lars oben empfohlen hat: Die links obere 3x3 Matrix wird nach Quaternionen umgewandelt, alle anderen Werte werden linear interpoliert. Das SLERP der Quaternionen mache ich dann wie Mike Lischke (Achtung C#):

Code:
  1. public static Quaternion QuaternionSLERP(Quaternion qStart, Quaternion qEnd, double pos)
  2.         {
  3.             Quaternion Result = new Quaternion();
  4.             Quaternion A = new Quaternion();
  5.             A = qStart;
  6.             A.Normalize();
  7.  
  8.             Quaternion B = new Quaternion();
  9.             B= qEnd;
  10.             B.Normalize();
  11.  
  12.             double cost = Vector3.VectorAngleCos(A.GetImagPart(), B.GetImagPart());
  13.             bool bflip;
  14.             if (cost < 0)
  15.             {
  16.                 cost = -cost;
  17.                 bflip = true;
  18.             }
  19.             else
  20.             {
  21.                 bflip = false;
  22.             }
  23.  
  24.             double beta;
  25.  
  26.             if (1 - cost < 0.00000001)
  27.             {
  28.                 beta = 1 - pos;
  29.             }
  30.             else
  31.             {
  32.                 double theta = Math.Acos(cost);
  33.                 double phi = theta;
  34.                 double sint = Math.Sin(theta);
  35.                 beta = Math.Sin(theta - pos * phi) / sint;
  36.                 pos = Math.Sin(pos * phi) / sint;
  37.             }
  38.  
  39.             if (bflip)
  40.             {
  41.                 pos = -pos;
  42.             }
  43.  
  44.             Result.X = beta * A.X + pos * B.X;
  45.             Result.Y = beta * A.Y + pos * B.Y;
  46.             Result.Z = beta * A.Z + pos * B.Z;
  47.             Result.W = beta * A.W + pos * B.W;
  48.  
  49.             Result.Normalize();
  50.  
  51.             return Result;
  52.         }        
  53.     }

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 15, 2007 22:04 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Also im Prinzip nutze ich ähnlichen Code und das Faden funktioniert nun ganz gut.
Einfach Interpolation ist wohl nicht so das Ware. Interessant ist aber noch den richtigen Rotationspunkt zu finden.
Wenn du einfach die Roationsmatrix per Slep rotierst und die Translations Werte linear interpolierst können einige Rotationen, deren Drehpunkte nicht auf 0,0,0 liege komisch aussehen.

Hier noch eine interessante quelle:
http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/index.htm

Ein Problem in deinem (Mike Lischke Code) tritt auf wenn eine Quaternion die Identity ist.
Dann ergibt: cost = Vector3.VectorAngleCos(A.GetImagPart(), B.GetImagPart()); sinnloses zeug, da der 2. Vector ImagPart (0,0,0) ist.
Das ist aber auf obriger seite gelöst.

2. Problem: was bei mir auch noch offen ist, ist bei genau 180°.
Dann dreht es bei mir mal rechts mal links, was nicht so top, aber akzeptabel ist.

Aber eigentlich war das ja oben von mir schon mal geschieben, sehe ich gerade....

Grüße
User69


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 16, 2007 10:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
user69 hat geschrieben:
Wenn du einfach die Roationsmatrix per Slep rotierst und die Translations Werte linear interpolierst können einige Rotationen, deren Drehpunkte nicht auf 0,0,0 liege komisch aussehen.


Das Problem habe ich gerade im Moment anscheinend auch: Wenn man sich folgendes Video ansieht, kann man bei Drehung der Köpfe erkennen, dass sie da ganz flach/dünn werden.
http://www.youtube.com/watch?v=B_KBBGBwdSs

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 16, 2007 17:23 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Glaub ich nciht, daß das hier dein probelm, ist das sollte sich eher in der drehung äußern.

Aber ich hatt mal einen ähnlichen Effekt, wo vergessen hatte bei Berechnungen von Matizen vektoren davor zu Normalisieren (z.B. SceenVector aus einer Roatation Matrix, siehe unten). Die Teile wurden immer flacher. Vielleicht hilft da ja.

DirectionVector:= Normalize(VectorScreen);
TmpMatrix:= OGL_MatrixMultiply(OGL_CreateRotationMatrix(-90, DirectionVector), Rot_Matrix);


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]