private double triLinInterp(double Q000, double Q001, double Q010,
			double Q011, double Q100, double Q101, double Q110, double Q111,
			double x0, double x1, double y0, double y1, double z0, double z1,
			Vector3d point) {
		// Pass 1
		double Q00 = linInterp(x0, x1, Q000, Q100, point.x);
		double Q01 = linInterp(x0, x1, Q001, Q101, point.x);
		double Q10 = linInterp(x0, x1, Q010, Q110, point.x);
		double Q11 = linInterp(x0, x1, Q011, Q111, point.x);
		// Pass 2
		double Q0 = linInterp(y0, y1, Q00, Q10, point.y);
		double Q1 = linInterp(y0, y1, Q01, Q11, point.y);
		// Pass 3
		return linInterp(z0, z1, Q0, Q1, point.z);
	}