From a1763c51eb57525674b885209755e46a3e8b9310 Mon Sep 17 00:00:00 2001 From: Andrew Guschin Date: Sat, 28 Nov 2020 20:42:24 +0400 Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B2=20Transform.h=20=D0=B2=206=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task06/Guschin/Transform.h | 64 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'task06/Guschin/Transform.h') 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); -- cgit v1.2.3