public Vector3d getLocalNormal(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 x = localPoint.x;
		double y0 = signedDistanceFieldMin.y + j * voxelUnit;
		double y1 = signedDistanceFieldMin.y + (j + 1) * voxelUnit;
		double y = localPoint.y;
		double z0 = signedDistanceFieldMin.z + k * voxelUnit;
		double z1 = signedDistanceFieldMin.z + (k + 1) * voxelUnit;
		double z = localPoint.z;

		double dx = ((y1 - y)
				* ((z1 - z) * (Q100 - Q000) + (z - z0) * (Q101 - Q001)) + (y - y0)
				* ((z1 - z) * (Q110 - Q010) + (z - z0) * (Q111 - Q011)))
				/ (voxelUnit * voxelUnit * voxelUnit);
		double dy = ((z1 - z)
				* ((x1 - x) * (Q010 - Q000) + (x - x0) * (Q110 - Q100)) + (z - z0)
				* ((x1 - x) * (Q011 - Q001) + (x - x0) * (Q111 - Q101)))
				/ (voxelUnit * voxelUnit * voxelUnit);
		double dz = ((x1 - x)
				* ((y1 - y) * (Q001 - Q000) + (y - y0) * (Q011 - Q010)) + (x - x0)
				* ((y1 - y) * (Q101 - Q100) + (y - y0) * (Q111 - Q110)))
				/ (voxelUnit * voxelUnit * voxelUnit);

		return new Vector3d(dx, dy, dz);
	}