public double getLocalSignedDistance(Vector3d position, Matrix3d rotation,
			Vector3d point) {
		Vector3d localPoint = getLocalPoint(position, rotation, point);

		// Calling methods should catch this since it means that a potentially
		// intersecting point is not intersecting after all.
		if ((localPoint.x > signedDistanceFieldMax.x
				|| localPoint.y > signedDistanceFieldMax.y || localPoint.z > signedDistanceFieldMax.z)
				|| (localPoint.x < signedDistanceFieldMin.x
						|| localPoint.y < signedDistanceFieldMin.y || localPoint.z < signedDistanceFieldMin.z)) {
			throw new IllegalArgumentException("Point outside object.");
		}
		Vector3d something = new Vector3d(localPoint);
		something.sub(signedDistanceFieldMin);
		something.scale(1 / voxelUnit);
		int i = (int) Math.floor(something.x);
		int j = (int) Math.floor(something.y);
		int k = (int) Math.floor(something.z);
		double Q000 = signedDistanceField[i][j][k];
		double Q001 = signedDistanceField[i][j][k + 1];
		double Q010 = signedDistanceField[i][j + 1][k];
		double Q011 = signedDistanceField[i][j + 1][k + 1];
		double Q100 = signedDistanceField[i + 1][j][k];
		double Q101 = signedDistanceField[i + 1][j][k + 1];
		double Q110 = signedDistanceField[i + 1][j + 1][k];
		double Q111 = signedDistanceField[i + 1][j + 1][k + 1];
		double x0 = signedDistanceFieldMin.x + i * voxelUnit;
		double x1 = signedDistanceFieldMin.x + (i + 1) * voxelUnit;
		double y0 = signedDistanceFieldMin.y + j * voxelUnit;
		double y1 = signedDistanceFieldMin.y + (j + 1) * voxelUnit;
		double z0 = signedDistanceFieldMin.z + k * voxelUnit;
		double z1 = signedDistanceFieldMin.z + (k + 1) * voxelUnit;

		return triLinInterp(Q000, Q001, Q010, Q011, Q100, Q101, Q110, Q111, x0,
				x1, y0, y1, z0, z1, localPoint);
	}