У меня есть точки в 3D-плоскости, которые я преобразовал в 2D-проекцию, используя следующий метод:
import numpy as np
# Calculate axes for 2D projection
# Create random vector to cross
rv = np.add(self.plane.normal, [-1.0, 0.0, 1.0])
rv = np.divide(rv, np.linalg.norm(rv))
horizontal = np.cross(self.plane.normal, rv)
vertical = np.cross(self.plane.normal, horizontal)
diff2 = np.zeros((len(point23D), 3), dtype=np.float32)
diff2[:, 0] = np.subtract(point23D[:, 0], self.plane.origin[0])
diff2[:, 1] = np.subtract(point23D[:, 1], self.plane.origin[1])
diff2[:, 2] = np.subtract(point23D[:, 2], self.plane.origin[2])
x2 = np.add(np.add(np.multiply(diff2[:, 0], horizontal[0]), np.multiply(diff2[:, 1], horizontal[1])), np.multiply(diff2[:, 2], horizontal[2]))
y2 = np.add(np.add(np.multiply(diff2[:, 0], vertical[0]), np.multiply(diff2[:, 1], vertical[1])), np.multiply(diff2[:, 2], vertical[2]))
twodpoints2 = np.zeros((len(point23D), 3), dtype=np.float32)
twodpoints2[:, 0] = x2
twodpoints2[:, 1] = y2
Затем я делаю некоторые вычисления для этих точек в 2D-пространстве. После этого мне нужно вернуть точки в трехмерном пространстве в той же относительной позиции. Для этого я написал следующий код:
# Transform back to 3D
rotation_matrix = np.array([[horizontal[0], vertical[0], -self.plane.normal[0]],
[horizontal[1], vertical[1], -self.plane.normal[1]],
[horizontal[2], vertical[2], -self.plane.normal[2]]])
transformed_vertices = np.matmul(twodpoints, rotation_matrix)
transformed_vertices = np.add(transformed_vertices, self.plane.origin)
Но, похоже, это не правильно делает проекцию, точки, спроецированные обратно в 3D, вообще не l ie на исходной плоскости 3D. Кто-нибудь знает, почему это неправильно, или у кого-то есть предложение, которое будет работать лучше?
В этом примере я просто спроецировал те же точки в 3D, чтобы увидеть, работает ли он правильно, а это не так. В действительности у меня будут разные точки, которые нужно проецировать обратно, но они все равно должны находиться в одной плоскости в трехмерном пространстве.