Пример #1
0
Ray PerspectiveCamera::generateRay(const Point2d &sample) const
{
	Point3d ori(0);
	Ray ray(ori, normalize(Vector3d(rasterToCamera_(Point3d(sample.x_, sample.y_, 0)))));

	if (focal_distance_ > 0) {
		static RandomNumberGenerator rng;
		Point2d tmp = Point2d(rng.Uniform2(), rng.Uniform2());
		ori = Point3d(tmp.x_, tmp.y_, 0) * radius_;
		double z = -(focal_distance_ / ray.direction().z_);
		Point3d hit(ray.direction() * z);
		ray.setDirection(normalize(hit - ori));
	}

	ray.setOrigin(cameraToWorld_(ori));
	return std::move(ray);
}