"Klaus Petersen" <ng@spectual.ra.bnaa.dk> skrev i en meddelelse
news:42c5153a$0$18643$14726298@news.sunsite.dk...
> Hej.
>
> Jeg forsøger at få defineret et perspektiv projektions matriks i min
> Direct3D applikation.
> Jeg har en funktion, der udfra en keglestub kan generere et matriks.
>
> Funktionen tager følgende parametrer: width, height, z_near og z_far.
>
> Jeg vil gerne have det sådan, at når jeg definerer et punkt i min verden,
> der har koordinaterne (x,y,z)=(0,0,1) at den bliver projekteret til
> skærmkoordinaterne (0,0).
>
> Og et andet punkt (640,0,1) vil blive projekteret til skærmkoordinaterne
> (640,0).
>
> Jeg ville kunne bruge et ortografisk projektions matriks til det, kan jeg
> vil gerne have muligheden for at lave perspektiv i billedet.
>
> Jeg ser dette mere som en matematiskopgave end en programmeringsopgave -
> derfor spørger jeg her.
>
> Kan nogen give et bud på hvad jeg skal sende ind som parametrer i
> funktionen
> for at opnå sådan et matriks?
>
> Klaus.
Som du formulerer det kan du jo blot ignorere z-koordinaten.
Jeg formoder, at du med perspektivet fx vil føre 1;0;10 over i 1/10;0 ...
altså sådan at x får en perspektivisk 'forkortning' omvendt proportional med
z-koordinaten. Det behøver du ikke en matrice til, fordi du jo blot fører
x,y,z over i x/z,y/z .. men det kan godt gennemføres med en matrice.
Hvis du arbejder med punkter, eller sammensætning af punkter til
linjer/vektorer, omkring 0,0,0 får du brug for at komme omkring problemet
med division med z=0. Det kan du umiddelbart, eller konceptuelt komme
omkring ved at definere det punkt du observerer fra ... altså fx at kalde
0,0,-20 for 'kameraets placering', sådan at x,y = x/(z+z0,) y/(z+z0).
(z0=-20). Hvis du holder dig til positive værdier for z svarer z0 lidt til
din z_near ..
Hvis du vil checke om det kan gøres så enkelt kan du lave en vektor af to
punkter, fx x0,y0,z0 = 0,0,0 og x1,y1,z1 = 1,0,0. Når du forskyder vektoren
0,0,5 (altså begge punkter) til hhv 0,0,5 og 1,0,5 ser du den perspektiviske
forsvinding ved, at vektorens længde kvrod((1-0)^2+(0+0)^2) reduceres med
1/5 .. eller hvis du vælger 0,0,20 som iagttagelsespunkt ændres længden fra
1/20 til 1/25 mod ellers 1 til 1/5.
Hvis du vil bruge en matrice skal du transformere dit koordinat-system over
i ét med 'kameraet's position som centrum, altså gennemføre en
transformation med 0,0,20, og gennemføre den perspektiviske skalering med z
på de nye koordinater.
Carsten
|