/* * DoRayMe - a quick and dirty Raytracer * Transformation implementation * * Created by Manoƫl Trapier * Copyright (c) 2020 986-Studio. * */ #include #include Matrix translation(double x, double y, double z) { Matrix ret = Matrix4().identity(); ret.set(0, 3, x); ret.set(1, 3, y); ret.set(2, 3, z); return ret; } Matrix scaling(double x, double y, double z) { Matrix ret = Matrix4(); ret.set(0, 0, x); ret.set(1, 1, y); ret.set(2, 2, z); ret.set(3, 3, 1); return ret; } Matrix rotation_x(double angle) { Matrix ret = Matrix4().identity(); ret.set(1, 1, cos(angle)); ret.set(1, 2, -sin(angle)); ret.set(2, 1, sin(angle)); ret.set(2, 2, cos(angle)); return ret; } Matrix rotation_y(double angle) { Matrix ret = Matrix4().identity(); ret.set(0, 0, cos(angle)); ret.set(0, 2, sin(angle)); ret.set(2, 0, -sin(angle)); ret.set(2, 2, cos(angle)); return ret; } Matrix rotation_z(double angle) { Matrix ret = Matrix4().identity(); ret.set(0, 0, cos(angle)); ret.set(0, 1, -sin(angle)); ret.set(1, 0, sin(angle)); ret.set(1, 1, cos(angle)); return ret; } Matrix shearing(double Xy, double Xz, double Yx, double Yz, double Zx, double Zy) { Matrix ret = Matrix4().identity(); ret.set(0, 1, Xy); ret.set(0, 2, Xz); ret.set(1, 0, Yx); ret.set(1, 2, Yz); ret.set(2, 0, Zx); ret.set(2, 1, Zy); return ret; }