using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RaytracerEngine { class camera { vec3 origin; vec3 lower_left_corner; vec3 horizontal; vec3 vertical; private const float scale = 0.1f; public camera() { origin = new vec3(0, 0, 0); lower_left_corner = new vec3(-2.0f, -1.0f, -1.0f); horizontal = new vec3(4.0f, 0.0f, 0.0f); vertical = new vec3(0.0f, 2.0f, 0.0f); } public ray get_ray(float u, float v) { return new ray(origin, lower_left_corner + u*horizontal + v*vertical - origin); } public void turn_left() { //rotational matrix on camera left 25* lower_left_corner = vec3.turn_y(lower_left_corner, 25); horizontal = vec3.turn_y(horizontal, 25); vertical = vec3.turn_y(vertical, 25); } public void turn_right() { //rotational matrix on camera right 25* lower_left_corner = vec3.turn_y(lower_left_corner, -25); horizontal = vec3.turn_y(horizontal, -25); vertical = vec3.turn_y(vertical, -25); } public void strafe_left() { vec3 forwards_back = vec3.cross(horizontal, vertical); forwards_back.normalize(); vec3 left_right = vec3.cross(vertical, forwards_back); left_right.normalize(); origin = origin - left_right * scale; } public void strafe_right() { vec3 forwards_back = vec3.cross(horizontal, vertical); forwards_back.normalize(); vec3 left_right = vec3.cross(vertical, forwards_back); left_right.normalize(); origin = origin + left_right * scale; } public void fore() { vec3 forwards_back = vec3.cross(horizontal, vertical); forwards_back.normalize(); origin = origin - forwards_back * scale; } public void back() { vec3 forwards_back = vec3.cross(horizontal, vertical); forwards_back.normalize(); origin = origin + forwards_back * scale; } } }