PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2d Bild aus 3d Szene berechnen


MartinB
2011-11-21, 16:11:35
Hallo, ich hoffe einige kennen sich hier mit Computergrafik aus ;)

Ich möchte gerne von Hand aus einer 3d Szene ein 2d Bild berechnen, bei vorgebenen Augpunkt, Blickpunkt und Abstand.

Mein Ansatz sieht wie folgt aus:



Gl.glPushMatrix();

//textbox 17 - 19: Augpunkt
//textbos 21 - 23: Blickpunkt (in diesem Beispiel 0)
//textbox 20: Abstand


float devider = 10f;

double[] n = new double[3] { System.Convert.ToSingle(textBox21.Text) / devider-System.Convert.ToSingle(textBox17.Text) / devider,
System.Convert.ToSingle(textBox22.Text) / devider-System.Convert.ToSingle(textBox18.Text) / devider,
System.Convert.ToSingle(textBox23.Text) / devider-System.Convert.ToSingle(textBox19.Text) / devider
};

double n_h = Math.Sqrt((n[0] * n[0] + n[1] * n[1] + n[2] * n[2]));
n[0] = n[0] / n_h;
n[1] = n[1] / n_h;
n[2] = n[2] / n_h;

double[] u = new double[3] { n[2], 0, -n[0] };

double[] v = new double[3] {n[1]*u[2]-n[2]*u[1],
n[2]*u[0]-n[0]*u[2],
n[0]*u[1]-n[1]*u[0]
};





//////Zurückverschieben4
Gl.glMultMatrixd(new double[16] { 1,0,0,0,
0,1,0,0,
0,0,1,0,
System.Convert.ToSingle(textBox17.Text) / devider,System.Convert.ToSingle(textBox18.Text) / devider,System.Convert.ToSingle(textBox19.Text) / devider,1}
);
////perspektive2
Gl.glMultMatrixd(new double[16] { u[0],v[0],-n[0],0,
u[1],v[1],-n[1],0,
u[2],v[2],-n[2],0,
0,0,0,1}
);



// ////plattmachen3

Gl.glMultMatrixd(new double[16] { 1,0,0,0,
0,1,0,0,
0,0,0.001f,1/ System.Convert.ToSingle(textBox20.Text),
0,0,0,1}
);

////perspektive2
Gl.glMultMatrixd(new double[16] { u[0],v[0],-n[0],0,
u[1],v[1],-n[1],0,
u[2],v[2],-n[2],0,
0,0,0,1}
);




////verschieben1
Gl.glMultMatrixd(new double[16] { 1,0,0,0,
0,1,0,0,
0,0,1,0,
-System.Convert.ToSingle(textBox17.Text) / devider,-System.Convert.ToSingle(textBox18.Text) / devider,-System.Convert.ToSingle(textBox19.Text) / devider,1}
);




drawCity(); //Hier wird die Szene generiert

Gl.glPopMatrix();

Doch das Ergebnis sieht völlig falsch aus. Hat jemand eine Idee wodran das liegen könnte?

Gast
2011-11-21, 23:10:04
Wenn ich das richtig verstehe willst du aus Position & "LookAt" Vektor eine Kamera-Posematrix (R|t) berechnen.

Dazu brauchst du erstmal noch mind. einen up-Vektor, sonst gehts nicht denke ich. Die Rotationsmatrix der Kamera kannst du dann folgendermaßen konstruieren: Die z-Richtung der Kamera ist dein LookAt Vektor (klar, dorthin schaut die Kamera), den x-Vektor bekommst du mit kreuzprodukt(z,up), den y-Vektor mit kreuzprodukt(z,x). Die Kameraposition t ist klarerweise der Positionsvektor. Das ist die Transformation vom Kamerakoordinatensystem ins globale Koordiantensystem. Wenn du die allgemein übliche Transformation vom globalen Koordinatenframe ins Kamerakoordinatensystem haben willst musst du die Rotationsmatrix invertieren = transponieren und die translation mit -inv(R)*t berechnen.

Wüfür bei dir der Abstand gut ist versteh ich nicht...

MartinB
2011-11-22, 08:08:17
Der oben vektor ist schon mit drinnen mit (0,1,0) und steckt in dem

double[] u = new double[3] { n[2], 0, -n[0] };

Ich habs jetz hinbekommen. Es haben 3 wichtige Teile gefehlt. Wie du schon sagtest, die Rücktransformationsmatrix und dann jeweils noch das hinrotieren um Z bzw das rückrotieren.