@Override public Vec normalAt(Point3D intersection, Ray ray) { for (Triangle tri : mesh) { if (tri.intersectTri(intersection, ray)) { Vec v1 = new Vec(tri.getP1(), tri.getP0()); Vec v2 = new Vec(tri.getP2(), tri.getP0()); return Vec.crossProd(v1, v2); } } return null; }
@Override public Hit nearestIntersection(Ray ray) { double minDistance = Double.POSITIVE_INFINITY; Object3D nearestTri = null; Point3D nearestIntersection = null; for (Triangle tri : mesh) { Point3D intersectionPoint = tri.planeIntersection(ray); if (intersectionPoint != null) { double length = new Vec(intersectionPoint, ray.origin).length(); length = length / ray.direction.length(); if (length < minDistance && tri.intersectTri(intersectionPoint, ray)) { minDistance = length; nearestTri = tri; nearestIntersection = intersectionPoint; } } } return new Hit(nearestIntersection, nearestTri, minDistance); }