public double getT(Ray r, RenderObject o) { Matrix m = new Matrix(); double[][] u = r.u3; double[][] ut = m.tMatrix(u); double[][] p = r.p0C.subtract(r.p0C, o.getOrigin()).toArray3D(); double[][] pt = m.tMatrix(p); double[][] aa = m.multiplyMatrix(ut, u); double a = aa[0][0]; double bb[][] = m.multiplyMatrix(ut, p); double b = bb[0][0] * 2; double cc[][] = m.multiplyMatrix(pt, p); double cee = cc[0][0] - (o.getRadius() * o.getRadius()); double existance = (b * b) - (4 * a * cee); if (existance < 0) { return -1; } else { double t1 = ((-1 * b) + Math.sqrt(existance)) / (2 * a); double t2 = ((-1 * b) - Math.sqrt(existance)) / (2 * a); if (t1 < 0 && t2 < 0) { return -1; } else if (t1 < 0) { return t2; } else if (t2 < 0) { return t1; } else { return Math.min(t1, t2); } } }