void Camera::generateRay(glm::vec3 pos, Ray *r, glm::vec3 eye) { glm::vec3 ray_vec(pos[0] - eye[0], pos[1] - eye[1], pos[2] - eye[2]); float norm = glm::dot(ray_vec,ray_vec); if (norm>0){ ray_vec /= glm::sqrt(norm); } Ray temp_ray(eye, ray_vec,.001,std::numeric_limits<float>::infinity(),1.0f); *r = temp_ray; }
void Camera::generate_rays(unsigned width, unsigned height, std::vector<Ray> & rays) { float distance = ((width/2) / tan(fov_x_ * M_PI / 360)); for (int y = ((int)height/-2); y < (int)height/2; ++y) { for (int x = ((int)width/-2); x < (int)width/2; ++x) { glm::vec3 direction(x, y, -(distance)); //Scale Camera if not default if (eye_.x != 0 || eye_.y != 0 || eye_.z != 0 || dir_.x != 0 || dir_.y != 0 || dir_.z != -1 || up_.x != 0 || up_.y != 1 || up_.z != 0 ) { glm::vec4 direct_temp(x, y, -(distance), 1); glm::vec3 u = glm::normalize(glm::cross(dir_, up_)); glm::vec3 v = glm::normalize(glm::cross(u, dir_)); dir_ = glm::normalize(dir_); // Matrix is implemented column x row glm::mat4 matrix(u.x, u.y, u.z, 0, v.x, v.y, v.z, 0, (dir_.x*-1), (dir_.y*-1), (dir_.z*-1),0, eye_.x, eye_.y, eye_.z, 1); // Matrix x Vector glm::vec4 new_direct = matrix * direct_temp; direction.x = new_direct.x; direction.y = new_direct.y; direction.z = new_direct.z; } Ray temp_ray(eye_, direction); rays.push_back(temp_ray); } } }