Программа для преобразования точек на 3D-плоскости в 2D-точки - PullRequest
0 голосов
/ 28 июня 2018

У меня есть нормальный вектор плоскости. Я хочу преобразовать 3D-точки в 2D-плоскость, сохраняя одинаковое расстояние между ними. По сути, я хочу сделать координату z всех точек на плоскости равной. Как мне добиться этого и написать для него программу (предпочтительно C #)? , Есть ли хорошие библиотеки, которые я могу использовать. Будет ли эта библиотека полезной Библиотека облаков точек

Моя цель в этом состоит в том, чтобы у меня было несколько линий (в одной плоскости) в трехмерном пространстве, и я хочу представить эти линии в 2D вместе с их измерениями

Пример плоскости моей проблемы. enter image description here

Я делаю это для приложения, которое я разрабатываю в единстве, используя Google ARcore

1 Ответ

0 голосов
/ 29 июня 2018

Хорошо. Я потратил немало времени на поиск решения этой проблемы. Я нашел простое решение этой проблемы с помощью ARcore, поскольку я делаю это с помощью ARCore (SDK дополненной реальности, предоставленный Google). Для тех, кто хочет достичь этого без использования ARcore, обратитесь к этим вопросам Вопрос 1 Вопрос 2 , где необходимо создать новый ортонормированный базис или повернуть плоскость, чтобы выровнять самолеты по умолчанию.

Для тех, кто использует ARcore в единстве, в этом выпуске на GitHub, созданном мной, есть более простое решение. По сути, мы можем легко создавать новые оси на трехмерной плоскости и записывать координаты из этой недавно созданной системы координат.

Если вы хотите проецировать трехмерные точки на плоскость, вам нужно иметь в виду двухмерную систему координат. Естественным является тот, который определяется глобальной осью, но он будет хорошо работать с одним видом плоскостей (скажем, горизонтальным), но не с другим (скажем, вертикальным). Другой выбор координат - тот, который определен CenterPose, но он может изменить каждый кадр. Так что если вам нужны 2d точки только для 1 кадра, это можно записать как:

x_local_axis = DetectedPlane.CenterPose.rotation * Vector3.forward;
z_local_axis = DetectedPlane.CenterPose.rotation * Vector3.right;
// loop over your points
x = Vector3.Dot(your_3d_point, x_local_axis);
z = Vector3.Dot(your_3d_point, z_local_axis);

Если вам нужна двумерная система координат, согласованная между кадрами, вы, вероятно, захотите прикрепить привязку к любой плоскости интереса, например, в DetectedPlane.CenterPose, и выполнить ту же математику, что и выше, но с вращением привязки вместо плоскость вращения. Оси x и z якоря обеспечат двухмерный кадр координат, который согласован между кадрами.

Таким образом, здесь, в центре плоскости, создаются новые локальные оси, и полученные точки будут иметь только 2 координаты.

...