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?
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?