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

Aktuelle Zeit: Fr Jul 18, 2025 08:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: 3D MotionVectoren in 2D umberechnen?
BeitragVerfasst: Di Mai 15, 2007 14:08 
Offline
DGL Member
Benutzeravatar

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

ich habe grad ein problem wo ich ein wenig festhänge... genauergesagt ein mathematisches :)
Ich habe ein bild gerendert und möchte bei diesem nun im nachhinein MotionBlur draufrechnen, dafür brauche ich die MotionVektoren für jedes Pixel (Die meisten Renderer können sowas mit ausgeben speziell dafür).

Das Problem ist jetzt, der renderer den ich benutze kann das nicht.. der kann lediglich ein bild mit den 3D-Motion Vektoren rausgeben (R = X, G = Y, B = Z)..
Aus diesem muß ich es nu irgendwie schaffen die 2D Vektoren zu berechnen (sprich, die richtugn in die sich das Pixel auf dem Bild bewegt).

Zusätzlich zu den 3D Vektoren hab ich aber noch allerlei andere infos pro pixel:

- 3D Motion Vektoren
- Z Kanale (entfernung vom pixel zur kamera)
- Weltkoordinate des Pixels im 3D Space
- Normale des Pixels (Worldspace)

Daraus müßte man es doch jetzt irgendwie hinbekommen den 2D Vektor zu errechnen, oder? :roll:
Ich steh da ziemlich auf dem schlauch.. ich hab zwar in der theorie mehrere anstäze, aber umsetzen könnt ich keinen davon so einfach weil mir dafür die mathematik fehlt..

Wär super wenn ihr mir da helfen könnt.. irgendwie.. :)

Aya~

PS: Falls bei den infos die ich pro pixel habe irgendwas wichtiges fehlt, einfach sagen.. ich kann noch ne menge mehr rausrendern, nur das sind die sachen die ich so oder so bräuchte und daher auch hab :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 15, 2007 14:42 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
müsstest du nicht eigentlich nur den 3D-Vektor mit der Projektionsmatrix multiplizieren ? somit hättest du einen 2D Vektor, den du verwenden könntest.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 15, 2007 14:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Seth hat geschrieben:
müsstest du nicht eigentlich nur den 3D-Vektor mit der Projektionsmatrix multiplizieren ? somit hättest du einen 2D Vektor, den du verwenden könntest.

Geht das so einfach?
Wenn ja, gibt es ne möglichkeit die projektionsmatrix aus den bildern zu generieren irgendwie? :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 15, 2007 14:51 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
durch die 2D Koordinaten der Pixel und die dazugehörigen 3D Weltkoordinaten müsste sich eigentlich die Projektionsmatrix berechnen lassen. Wie genau weiß ich aber im moment auch nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 10:21 
Offline
DGL Member
Benutzeravatar

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

hab es mal probiert einfach den 3D Vektor mit der ProjektionsMatrix zu multiplizieren... sieht an und für sich auch ganz richtig aus in den meisten fällen, nur wenn ich z.B. eine kugel nur in X und Z bewege (Z = Tiefe), dann kommt beim 2D Vektor am ende sehr starke X-Bewegung raus, was ja total falsch ist.. denn 2D mäßig bewegt sich die kugel nur ein wenig in Y-Richtung.

oder muß ich mit dem Vektor nochwas machen nachdem ich ihn mit der Matrix multipliziert habe? (Hab jetzt einfach Vektor*Matrix und von dem resultat dann nur X und Y genommen einfach).

Oder muß ich evtl die invertierte matrix nehmen oder so?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 10:54 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
wenn z nach hinten ist, kann es durchaus sein, dass sich der effekt durch die perspektivische verzerrung erhöht, ein paar screenshots dazu wären hilfreich-


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 11:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Bild
Die selektierte kugel ganz rechts geht nur in Z-Richtung nach hinten.. in 2D dann nur in Y-Richtung nach oben durch die projektion halt.

Aber wenn ich den vektor mit der matrix multipliziere komme ich auf einen negativen x wert :(

Die ProjektionsMatrix:
Code:
  1. 0.571429f, 0.0f, 0.0f, 0.0f,
  2. 0.0f, 0.571429f, 0.0f, 0.0f,
  3. 0.0f, 0.0f, -0.571429f, 0.0f,
  4. 0.0f, 0.0f, 0.0f, 1.0f


Der 3D Vektor der kugel:
Code:
  1. -0.286 | 0.0 | -0.46813


Ne idee?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 11:30 
Offline
DGL Member
Benutzeravatar

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

ich hab es jetzt auch mal mit der invertierten matrix versucht, klappt leider auch nicht.
Mir ist dabei noch aufgefallen das bei der Kugel ganz rechts nach dem multiplizieren noch ein Z-Wert da ist... muß ich mit dem vektor nachdem ich ihn multipliziert habe noch irgendwas machen?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Aya,
Zitat:
Die ProjektionsMatrix:
Code:
0.571429f, 0.0f, 0.0f, 0.0f,
0.0f, 0.571429f, 0.0f, 0.0f,
0.0f, 0.0f, -0.571429f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f


Darf ich fragen, was das für eine Projektionsmatrix ist? Den Werten nach zu schließen, skaliert sie nur, aber irgendwie komisch (die Z-Komponente ist negativ, alle anderen sind positiv). Die Matrix von glFrustum kanns nicht sein, die von glOrtho auch nicht.
??
Traude

Nachtrag: der Z-Wert des Vektors dient höchstwahrscheinlich dem Tiefentest (aber nagel mich nicht fest drauf) :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 14:51 
Offline
DGL Member
Benutzeravatar

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

mh.. das war die projektionsMatrix die mir der Maya Viewport gegeben hat.. aber, ich hab grad noch eine andere funktion gefunden, kann aber so direkt nichts mit anfangen:

Zitat:
Returns the orthographic or perspective projection matrix for the camera. The projection matrix that maya's software renderer uses is almost identical to the OpenGL projection matrix. The difference is that maya uses a left hand coordinate system and so the entries [2][2] and [3][2] are negated.


Die funktion liefert mir dann die matrix:
Code:
  1. 2.812143 0 0 0 0 4.997178 0 0 0 0 1.0002 0.20002 0 0 -1 0


aber da irritiert mich irgendwie das -1 an vorletzter stelle...

In Maya ist meine kamera so positioniert:
X: 10
Y: 5
Z: 10
RotateX: -15
RotateY: 45
RotateZ: 0

Die Translate-Werte fehlen irgendwie in der Matrix, oder?
Ich hab in Maya auch die Front, Right und UpVektoren der Kamera sowie deren position.. kann ich daraus irgendwie selber die matrix basteln, welche ich brauche?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 15:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Die Kamera-Werte beeinflussen normalerweise die Modelview-Matrix. Daher sind die Translationswerte auch nicht in der Projektionsmatrix.


Ich glaube es geht so:

Bildpunkt = Vertex * ModelViewMatrix*ProjectionMatrix.

Also in dieser Reihenfolge.

In OpenGL werden die Projektions-Matrizen so gebaut, wie es in unserem Wiki bei "glOrtho" und "glFrustum" beschrieben ist.

Wie man die ModelviewMatrix baut, kann ich Dir sagen, wenn Du das brauchst, denn das mach ich immer selber. Ist aber mit Aufwand verbunden, wenn Du es händisch rechnen willst; hier ein Auszug aus meiner selbst gebastelten Vector3DMathUnit
(die inverse Translationsmatrix brauchst Du nicht, das ist für Gelenke gedacht):
Ach ja noch was: TSpValueSmall ist einfach ein Single.

Code:
  1.  
  2. //********************************************************************
  3.    TCombinedMatrixMode = (WithInvers, WithoutInvers);
  4.    TSpMatrix16S = Array[0..15] Of TSpValueSmall; // eine OpenGL-Matrix
  5.    TVector3D = Record        // TVector3D ist ein OpenGL-Vektorformat
  6.       X,Y,Z: TSpValueSmall;  // X-,Y-,Z-Koordinaten des Vektors
  7.    End;
  8.    TRotation3D = Record        // Rotationsangaben:
  9.       Angle: TSpValueSmall;    // Rotationswinkel
  10.       Vector: TVector3D;       // Rotationsachse (Einheitsvektor)
  11.    End;
  12. //********************************************************************
  13. // Erstellt die kombinierte Transformationsmatrix
  14. Function MatrixTransform(AShift: TVector3D; AScale: TVector3D;
  15.    ARotation: TRotation3D; Invers: TCombinedMatrixMode): TSpMatrix16S;
  16. Var MatRotation, MatScaleTranslate, MatInvers: TSpMatrix16S;
  17.     Sinus,Cosinus: TSpValueSmall;
  18. Begin
  19.    // Sinus,Cosinus Winkel
  20.    // Sin²+Cos² = 1 ===> Sin = Sqrt(1-Cos²)
  21.    With ARotation Do Begin
  22.       Cosinus:= Cos(Angle*PI/180);
  23.       Sinus:= Sin(Angle*PI/180);
  24.       //Sinus:= Sqrt(1-Cosinus*Cosinus); Hier verliert man das Vorzeichen!
  25.    End;
  26.  
  27.    // Rotationsmatrix bestücken
  28.    MatRotation:= MatUnity;
  29.    With ARotation.Vector Do Begin
  30.       MatRotation[ 0]:= X*X*(1-Cosinus) + Cosinus;
  31.       MatRotation[ 1]:= X*Y*(1-Cosinus) + Z*Sinus;
  32.       MatRotation[ 2]:= X*Z*(1-Cosinus) - Y*Sinus;
  33.  
  34.       MatRotation[ 4]:= Y*X*(1-Cosinus) - Z*Sinus;
  35.       MatRotation[ 5]:= Y*Y*(1-Cosinus) + Cosinus;
  36.       MatRotation[ 6]:= Y*Z*(1-Cosinus) + X*Sinus;
  37.  
  38.       MatRotation[ 8]:= Z*X*(1-Cosinus) + Y*Sinus;
  39.       MatRotation[ 9]:= Z*Y*(1-Cosinus) - X*Sinus;
  40.       MatRotation[10]:= Z*Z*(1-Cosinus) + Cosinus;
  41.    End;
  42.  
  43.    // Skalierungs/Translationsmatrix bestücken
  44.    MatScaleTranslate:= MatUnity;
  45.    With AScale Do Begin
  46.       MatScaleTranslate [0]:=X;
  47.       MatScaleTranslate [5]:=Y;
  48.       MatScaleTranslate[10]:=Z;
  49.    End;
  50.    With AShift Do Begin
  51.       MatScaleTranslate[12]:=X;
  52.       MatScaleTranslate[13]:=Y;
  53.       MatScaleTranslate[14]:=Z;
  54.    End;
  55.    // Inverse Translationsmatrix bestücken
  56.    MatInvers:= MatUnity;
  57.    With AShift Do Begin
  58.       MatInvers[12]:=-X; MatInvers[13]:=-Y; MatInvers[14]:=-Z;
  59.    End;
  60.  
  61.    // Transformationsmatrix berechnen
  62.    If Invers = WithInvers
  63.       Then Result:= MatInvers
  64.       Else Result:= MatUnity;
  65.    Result:= Matrix_X_Matrix(MatRotation,Result);
  66.    Result:= Matrix_X_Matrix(MatScaleTranslate,Result);
  67. End;



EDIT: Hey Vorsicht: ich habe gerade nochmal in Deinem vorigen Post nachgelesen:
Zitat:
The difference is that maya uses a left hand coordinate system and so the entries [2][2] and [3][2] are negated.


Zuletzt geändert von Traude am Mi Mai 16, 2007 15:54, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 15:53 
Offline
DGL Member
Benutzeravatar

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

ook, danke schau ich mir mal an :)
Aber nur um sicherzugehen das ich mir jetzt nich hier ewig viel mühe umsonst mache...

Funktioniert es sicher, das wenn ich den 3D Vektor (ist ja nur der richtungsvektor in Weltkoordinaten) mit der projektions und modelMatrix multipliziere, das ich dann den 2D Vektor auf kameraebene bekomme? Oder ist das jetzt nur eine annahme das es dann gehen "könnte"? ^^

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 15:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Nein, das ist nicht nur eine Annahme. Du musst Dich aber ein wenig mit Matrizenrechnung auskennen. Und sieh Dir nochmal das Edit in oben meinem Post an: sie haben ein gegenläufiges Koordinatensystem. Und das kann ich Dir jetzt nicht sicher sagen, ob man bei meiner Matrix einfach die gleichen Positionen austauschen muss. :oops:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 16:27 
Offline
DGL Member
Benutzeravatar

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

und brauch ich zwingend beide matritzen? Also Projection und Modelview?

Uund, ich hab zwar die rotationswerte etc, sprich ich könnte sie bei deiner procedure da einsetzen.. allerdings, gibt es nicht ne möglichkeit das über die Up, Front und Right Vektoren der Camera zu berechnen? Denn die Rotation/Translations daten der Camera in Maya müßen nich immer unbedingt zwingend dem entsprechen was du für die formel brauchst glaube ich... z.B. kann die RotationOrder verändert sein, oder nen Shear auf der camera, oder was weiß ich für sachen.. :)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 16, 2007 17:33 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
One hier jetzt alles zu lesen:

Aktuellen und alten Positionsvektor mit der ModelViewProjection Matrix multiplizieren, beide Vektoren durch ihren W Anteil teilen (Macht sonst die feste Pipeline) und die Differenz berechnen. X und Y des Differzvektors beziehen sich dann auf die Frambuffer koordinaten von -1;-1 nach 1;1 um diesen Vektor in einem postprozessing mit Texturkoordinaten zu verwenden muss er noch mit 0.5 multipliziert werden.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]