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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
Vec3 Project(Vec3& a, qval d) { Vec3 n; n[0] /= (1 - a[2] / d); n[1] /= (1 - a[2] / d); n[2] /= (1 - a[2] / d); return n; }
void Mat4Mul(TMat& a, TMat& b, TMat& c) { TMat temp; for (quint i = 0; i < 4; i++) { for (quint j = 0; j < 4; j++) { temp[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j] + a[i][2] * b[2][j] + a[i][3] * b[3][j]; } } c = temp; }
void TMat::Rotate(qval x, qval y, qval z) { float ax[4][4]{ { 1, 0, 0, 0 }, { 0, cos(x), -sin(x), 0 }, { 0, sin(x), cos(x), 0 }, { 0, 0, 0, 1 } }; float ay[4][4]{ { cos(y), 0, sin(y), 0 }, { 0, 1, 0, 0 }, { -sin(y), 0, cos(y), 0 }, { 0, 0, 0, 1 } }; float az[4][4]{ { cos(z), -sin(z), 0, 0 }, { sin(z), cos(z), 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; TMat tempx(ax); TMat tempy(ay); TMat tempz(az); TMat temp; Mat4Mul(tempx, tempy, temp); Mat4Mul(temp, tempz, temp); Mat4Mul(temp, *this, *this); }
void TMat::Translate(qval x, qval y, qval z) { float a[4][4]{ { 1, 0, 0, x }, { 0, 1, 0, y }, { 0, 0, 1, z }, { 0, 0, 0, 1 } }; TMat temp(a); Mat4Mul(temp, *this, *this); }
void TMat::Scale(qval x, qval y, qval z) { float a[4][4]{ { x, 0, 0, 0 }, { 0, y, 0, 0 }, { 0, 0, z, 0 }, { 0, 0, 0, 1 } }; TMat temp(a); Mat4Mul(temp, *this, *this); }
void TMat::Projection(qval d) { float a[4][4]{ { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, -1/d, 1} }; TMat temp(a); Mat4Mul(temp, *this, *this); }
void Vec3::Multiply(TMat& tm) { qval x = vec[0] * tm[0][0] + vec[1] * tm[0][1] + vec[2] * tm[0][2] + tm[0][3]; qval y = vec[0] * tm[1][0] + vec[1] * tm[1][1] + vec[2] * tm[1][2] + tm[1][3]; qval z = vec[0] * tm[2][0] + vec[1] * tm[2][1] + vec[2] * tm[2][2] + tm[2][3]; qval w = vec[0] * tm[3][0] + vec[1] * tm[3][1] + vec[2] * tm[3][2] + tm[3][3]; vec[0] = x / w; vec[1] = y / w; vec[2] = z / w; }
|