diff options
Diffstat (limited to 'task06/Guschin/Transform.h')
| -rw-r--r-- | task06/Guschin/Transform.h | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/task06/Guschin/Transform.h b/task06/Guschin/Transform.h index d1b0af5..9c3b662 100644 --- a/task06/Guschin/Transform.h +++ b/task06/Guschin/Transform.h @@ -48,6 +48,70 @@ mat3 rotate(float theta) return *res; } +mat4 rotate(float theta, vec3 n) +{ + n = norm(n); + mat3 nCross = crossM(n); + mat3 id = mat3(1.f); + mat3 m1 = id + nCross * sin(theta); + mat3 m2 = nCross * (nCross * (1.f - cos(theta))); + mat3 m = m1 + m2; + + return mat4(vec4(m[0], 0.f), + vec4(m[1], 0.f), + vec4(m[2], 0.f), + vec4(0.f, 0.f, 0.f, 0.f)); +} + +mat4 rotateP(float theta, vec3 n, vec3 P) { + return translate(P.x, P.y, P.z) * + (rotate(theta, n) * translate(-P.x, -P.y, -P.z)); +} + +mat4 lookAt(vec3 S, vec3 P, vec3 u) { + vec3 e3 = S - P; + e3 *= 1.f / length(e3); + + vec3 e1 = cross(u, e3); + e1 *= 1.f / length(e1); + + vec3 e2 = cross(e3, e1); + e2 *= 1.f / length(e2); + + mat4 T = translate(-S.x, -S.y, -S.z); + return mat4(vec4(e1, 0.f), + vec4(e2, 0.f), + vec4(e3, 0.f), + vec4(0.f, 0.f, 0.f, 1.f)) * T; +} + +mat4 ortho(float l, float r, float b, float t, float zn, float zf) { + return mat4( + vec4(2.f / (r - l), 0.f, 0.f, -(r + l) / (r - l)), + vec4(0.f, 2.f / (t - b), 0.f, -(t + b) / (t - b)), + vec4(0.f, 0.f, -2 / (zf - zn), -(zf + zn) / (zf - zn)), + vec4(0.f, 0.f, 0.f, 1.f)); +} +mat4 frustum(float l, float r, float b, float t, float n, float f) { + return mat4( + vec4(2.f * n / (r - l), 0.f, (r + l) / (r - l), 0.f), + vec4(0.f, 2.f * n / (t - b), (t + b) / (t - b), 0.f), + vec4(0.f, 0.f, -(f + n) / (f - n), -(2.f * f * n) / (f - n)), + vec4(0.f, 0.f, -1.f, 0.f)); +} +mat4 perspective(float fovy, float aspect, float n, float f) { + return mat4( + vec4(1.f / aspect / tanf(fovy / 2.f), 0.f, 0.f, 0.f), + vec4(0.f, 1.f / tanf(fovy / 2.f), 0.f, 0.f), + vec4(0.f, 0.f, -(f + n) / (f - n), -2.f * f * n / (f - n)), + vec4(0.f, 0.f, -1.f, 0.f)); +} + +mat3 cadrRL(vec2 Vc, vec2 V, vec2 Wc, vec2 W) { + return translate(Wc.x, Wc.y) * + (scale(W.x / V.x, -W.y / V.y) * translate(-Vc.x, -Vc.y)); +} + mat3 mirrorX() { mat3* res = new mat3(1.f); |