Хорошо. Я потратил немало времени на поиск решения этой проблемы. Я нашел простое решение этой проблемы с помощью 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 координаты.