Ich bin ziemlich sicher, dass jedes beliebige LowLevel-3D-API-Tutorial die Formeln hat, die Du suchst. Außerdem solltest Du ein Auge auf die Matrix&Quaternion-FAQ haben - schon etwas älter, aber jede Menge guter Ideen und Tricks.
Aus meinem Code fix rauskopiert:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
/** Erzeugt eine perspektivische Projektionsmatrix.
* Diese Matrix sorgt dafür, daß alle Koordinaten auf einen standardisierten Raum zusammengestaucht
* werden. Vorderkante, Hinterkante und Öffnungswinkel bilden zusammen einen Pyramidenstumpf,
* der den sichtbaren Bereich darstellt.
* @param hoeheZuBreite Höhe des Sichtbereichs durch Breite desselben.
* @param vorderkante Geringster Z-Wert, bei dem Geometrie noch sichtbar ist.
* @param hinterkante Größter Z-Wert, bis zu dem Geometrie noch sichtbar ist.
* @param sichtwinkel Öffnungswinkel der Kamera in Radian. Üblich sind 90 Grad, als Pi/2.
*/
template <typename Skalar>
BMatrix4x4<Skalar> PerspektivProjektion( Skalar hoeheZuBreite, Skalar vorderkante, Skalar hinterkante, Skalar sichtwinkel)
{
BMatrix4x4<Skalar> ziel;
// X-Achse
ziel.a1 = 1 / tan( sichtwinkel/2);
ziel.a2 = 0; ziel.a3 = 0; ziel.a4 = 0;
// Y-Achse
ziel.b2 = 1 / tan( sichtwinkel/2) / hoeheZuBreite;
ziel.b1 = 0; ziel.b3 = 0; ziel.b4 = 0;
// Z-Achse
ziel.c3 = hinterkante / (hinterkante - vorderkante);
ziel.c4 = -hinterkante * vorderkante / (hinterkante - vorderkante);
ziel.c1 = 0; ziel.c2 = 0;
// W-Achse
ziel.d3 = 1;
ziel.d1 = 0; ziel.d2 = 0; ziel.d4 = 0;
return ziel;
}
|
Matrix-Layout ist bei mir genauso wie bei OpenGL, wenn ich mich recht erinnere:
|
Quellcode
|
1
2
3
4
|
a1 a2 a3 a4
b1 b2 b3 b4
c1 c2 c3 c4
d1 d2 d3 d4
|
Der Verschiebungsvektor erscheint darin in der rechtesten Spalte (a4, b4, c4) und nur die Perspektivprojektion benutzt jemals die vierte Zeile. Wenn das bei Dir anders ist, dann musst Du evtl. die Matrix noch transponieren.