void rayCubeCollisionTests() { // hit a cube vxVector cubeA(0, 0, 0); vxVector cubeB(64, 64, 64); vxRay testRay(vxVector(-64, -64, -64), vxVector(1, 1, 1)); assert(testRay.intersect(cubeA, cubeB).hit); // miss a cube vxRay antiTestRay(vxVector(70, 70, 70), vxVector(-1, -1, 0)); assert(!antiTestRay.intersect(cubeA, cubeB).hit); }
void rayPlaneCollisionTests() { vxVector planeA(-5, 0, 0); vxVector planeB(5, 0, 0); vxVector planeC(5, 5, 0); // hit going forward vxRay testRay(vxVector(0, 2.5, -5), vxVector(0, 0, 1)); assert(testRay.intersect(planeA, planeB, planeC).hit); // see if it hits even if the direction is backward vxRay infiniteHitRay(vxVector(0, 2.5, -5), vxVector(0, 0, -1)); assert(infiniteHitRay.intersect(planeA, planeB, planeC).hit); }
void RealisticCamera::TestExitPupilBounds() const { Float filmDiagonal = film->diagonal; static RNG rng; Float u = rng.UniformFloat(); Point3f pFilm(u * filmDiagonal / 2, 0, 0); Float r = pFilm.x / (filmDiagonal / 2); int pupilIndex = std::min((int)exitPupilBounds.size() - 1, (int)std::floor(r * (exitPupilBounds.size() - 1))); Bounds2f pupilBounds = exitPupilBounds[pupilIndex]; if (pupilIndex + 1 < (int)exitPupilBounds.size()) pupilBounds = Union(pupilBounds, exitPupilBounds[pupilIndex + 1]); // Now, randomly pick points on the aperture and see if any are outside // of pupil bounds... for (int i = 0; i < 1000; ++i) { Point2f pd = ConcentricSampleDisk( Point2f(rng.UniformFloat(), rng.UniformFloat())); pd *= RearElementRadius(); Ray testRay(pFilm, Point3f(pd.x, pd.y, 0.f) - pFilm); Ray testOut; if (!TraceLensesFromFilm(testRay, &testOut)) continue; if (!Inside(pd, pupilBounds)) { fprintf(stderr, "Aha! (%f,%f) went through, but outside bounds (%f,%f) - " "(%f,%f)\n", pd.x, pd.y, pupilBounds.pMin[0], pupilBounds.pMin[1], pupilBounds.pMax[0], pupilBounds.pMax[1]); RenderExitPupil( (Float)pupilIndex / exitPupilBounds.size() * filmDiagonal / 2.f, 0.f, "low.exr"); RenderExitPupil((Float)(pupilIndex + 1) / exitPupilBounds.size() * filmDiagonal / 2.f, 0.f, "high.exr"); RenderExitPupil(pFilm.x, 0.f, "mid.exr"); exit(0); } } fprintf(stderr, "."); }