У меня есть многоугольник, ориентированный каким-либо образом и расположенный в любом месте в трехмерном пространстве. Мне нужно преобразовать многоугольник в плоскость xy, чтобы я мог выполнять над ним различные операции (в частности, создавать сетку точек через ограничительную рамку многоугольника) в 2d, а не в 3d, а затем преобразовать его обратно.
Проблема возникает с ориентацией преобразованного многоугольника. Если бы я просто хотел повернуться в плоскости, я мог бы взять угол между нормалью многоугольника и плоскостью xy и повернуть вокруг оси, ортогональной обеим (перекрестное произведение). Однако я требую, чтобы ограничивающая рамка многоугольника была ориентирована таким образом, чтобы нижний край (наименьшее значение z) ограничивающей рамки находился в одной плоскости с плоскостью xy как до, так и после преобразования. Другими словами, ограничивающая рамка опирается на одну сторону, параллельную земле. После преобразования это ребро будет параллельно оси x. Это сделано для того, чтобы сетка точек, которую я генерирую на поверхности, всегда имела ряды, идущие параллельно земле, независимо от ориентации полигона.
Мой подход заключается в выполнении двух вращений; сначала поверните вокруг оси z на угол между линией, образованной пересечением плоскости многоугольника и плоскости xy, и осью x. Это гарантирует, что нижняя часть ограничивающей рамки не выйдет за пределы плоскости xy. Затем снова поверните вокруг оси x на угол между нормалью многоугольника (новой) и плоскостью xz. Вот шаги:
- Найдите уравнение плоскости многоугольника (по нормали).
- Найдите пересечение плоскости многоугольника и плоскости xy. Это линия в плоскости xy.
- Найдите угол между этой линией и осью x.
- Поверните многоугольник на этот угол вокруг оси Z.
- Определить новую норму.
- Найдите угол между новой нормалью и нормалью плоскости xy.
- Поверните многоугольник на этот угол вокруг оси x.
- Теперь полигон должен находиться в плоскости xy; создать ограничивающую рамку, используя максимальные/минимальные значения x и y, создать сетку точек и т. д., а затем преобразовать все обратно в исходное положение.
Я понимаю, что два вращения должны быть объединены, чтобы уменьшить количество матричных умножений, но это общий алгоритм.
Я не эксперт по графике; может кто посоветует эту технику? Есть ли способ лучше? Мой подход звучит правильно? Я разрабатываю Java и рассматриваю использование класса Transform3D для поворотов.