1 module hoekjed.dingen.zicht; 2 import hoekjed.kern; 3 4 abstract class Zicht : Ding { // VOEG TOE: zicht als ding in de wereld. 5 Mat!4 projectieM; 6 Mat!4 zichtM; 7 8 override void teken() { 9 } 10 11 override void denk() { 12 } 13 14 override protected void werkBij(bool ouderAangepast) { 15 werkZichtMBij(); 16 werkProjectieMBij(); 17 super.werkBij(ouderAangepast); 18 } 19 20 abstract void werkProjectieMBij(); 21 void werkZichtMBij() { 22 zichtM = Mat!(4).identiteit; 23 zichtM[0][3] = -_plek.x; 24 zichtM[1][3] = -_plek.y; 25 zichtM[2][3] = -_plek.z; 26 zichtM = Mat!(4).draaiMy(-_draai.y).maal(Mat!(4).draaiMx(-_draai.x) 27 .maal(Mat!(4).draaiMz(-_draai.z)).maal(zichtM)); 28 zichtM[0][] = zichtM[0][] / grootte.x; 29 zichtM[1][] = zichtM[1][] / grootte.y; 30 zichtM[2][] = zichtM[2][] / grootte.z; 31 } 32 } 33 34 class DiepteZicht : Zicht { 35 nauwkeurigheid schermverhouding; 36 nauwkeurigheid zichthoek; 37 nauwkeurigheid voorvlak; 38 nauwkeurigheid achtervlak; 39 40 this(nauwkeurigheid schermverhouding = 1920.0 / 1080.0, nauwkeurigheid zichthoek = 90, 41 nauwkeurigheid voorvlak = 0.01, nauwkeurigheid achtervlak = 100) { 42 this.voorvlak = voorvlak; 43 this.achtervlak = achtervlak; 44 this.zichthoek = zichthoek; 45 this.schermverhouding = schermverhouding; 46 } 47 48 override void werkProjectieMBij() { 49 import std.math : tan; 50 51 alias A = achtervlak; 52 alias V = voorvlak; 53 54 const nauwkeurigheid a = 1 / tan(zichthoek / 2); 55 projectieM.mat = [ 56 [a, 0, 0, 0], [0, 0, schermverhouding * a, 0], 57 [0, (A + V) / (A - V), 0, -(2 * A * V) / (A - V)], 58 [0, cast(nauwkeurigheid) 1, 0, 0] 59 ]; 60 } 61 } 62 63 // VOEG TOE: VlakteZicht 64 class VlakteZicht : Zicht { 65 nauwkeurigheid breedte_1; 66 nauwkeurigheid hoogte_1; 67 nauwkeurigheid voorvlak; 68 nauwkeurigheid achtervlak; 69 70 this(nauwkeurigheid breedte = 16, nauwkeurigheid hoogte = 9, nauwkeurigheid voorvlak = 0, nauwkeurigheid achtervlak = 100) { 71 this.breedte_1 = 1 / breedte; 72 this.hoogte_1 = 1 / hoogte; 73 this.voorvlak = voorvlak; 74 this.achtervlak = achtervlak; 75 } 76 77 override void werkProjectieMBij() { 78 nauwkeurigheid a = 1 / (achtervlak - voorvlak); 79 projectieM.mat = [ 80 [2 * breedte_1, 0, 0, 0], [0, 0, 2 * hoogte_1, 0], 81 [0, 2 * a, 0, -(achtervlak + voorvlak) * a], 82 [0, 0, 0, cast(nauwkeurigheid) 1] 83 ]; 84 } 85 }