Преобразование точек обратно в 3D - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть точки в 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, чтобы увидеть, работает ли он правильно, а это не так. В действительности у меня будут разные точки, которые нужно проецировать обратно, но они все равно должны находиться в одной плоскости в трехмерном пространстве.

1 Ответ

0 голосов
/ 07 апреля 2020
# You have a plane perpendicular to a vector 
# N = np.array([x_N, y_N, z_N]) 
# and passing through a point 
# Q = np.array([x_Q, y_Q, z_Q])

U = np.zeros((3,3))
U[2,:] = N / np.linalg.norm(N)
e = np.array([0,0,0])
e[np.argmin(np.abs(U[0,:]))] = 1

U[0, :] = np.cross(e, U[2,:])
U[0, :]  = U[0, :]  / np.linalg.norm(U[0, :])

U[1, :]  = np.cross(U[2, :], U[0, :])

point2D = (point23D - Q).dot(U)
result_point2D = some_calcs(point2D)
result_point23D = res_point2D.dot(U.transpose())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...