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