Вращение трехмерного многоугольника в плоскость xy при сохранении ориентации - PullRequest
0 голосов
/ 17 мая 2011

У меня есть многоугольник, ориентированный любым способом и расположенный где-либо в трехмерном пространстве. Мне нужно преобразовать многоугольник в плоскость xy, чтобы я мог выполнять над ним различные операции (в частности, создавать сетку точек через ограничивающую рамку многоугольника) в 2d, а не в 3d, а затем преобразовать его обратно.

Проблема связана с ориентацией преобразованного многоугольника. Если бы я просто хотел повернуть в плоскость, я мог бы взять угол между нормалью многоугольника и плоскостью xy и повернуть вокруг оси, ортогональной обеим (перекрестное произведение). Однако я требую, чтобы ограничивающий прямоугольник многоугольника был ориентирован так, чтобы нижний (наименьший z-значение) край ограничивающего прямоугольника находился в одной плоскости с плоскостью xy как до, так и после преобразования. Другими словами, ограничительная коробка лежит заподлицо на одной стороне, которая параллельна земле. После преобразования этот край будет параллелен оси X. Это так, что сетка точек, которые я создаю на поверхности, всегда будет иметь ряды, параллельные поверхности, независимо от ориентации многоугольника.

Мой подход - выполнить два поворота; сначала поверните вокруг оси z на угол между линией, образованной пересечением плоскости многоугольника и плоскости xy, и осью x. Это гарантирует, что нижняя часть ограничительной рамки не выходит за пределы плоскости xy. Затем снова поверните вокруг оси x на угол между (новой) нормалью многоугольника и плоскостью xz. Вот шаги:

  1. Найти уравнение для плоскости многоугольника (из нормали).
  2. Найдите пересечение плоскости многоугольника и плоскости xy. Это линия в плоскости ху.
  3. Найдите угол между этой линией и осью X.
  4. Поворот многоугольника на этот угол вокруг оси Z.
  5. Определить новый нормальный.
  6. Найти угол между новой нормалью и плоскостью xy.
  7. Поворот многоугольника на этот угол вокруг оси X.
  8. Полигон теперь должен находиться в плоскости xz; сгенерируйте ограничивающий прямоугольник, используя значения max и min x и y, сгенерируйте точечную сетку и т. д., затем преобразуйте все обратно в исходное положение

Я понимаю, что два вращения должны быть объединены, чтобы уменьшить количество умножений матриц, но это общий алгоритм.

Я не специалист по графике; Кто-нибудь может дать совет по этой технике? Есть ли способ лучше? Мой подход звучит правильно? Я занимаюсь разработкой на Java и планирую использовать класс Transform3D для поворотов.

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Для обработки трехмерных полигонов обычно просто игнорировать координату Z (которая эффективно проецирует плоскость непосредственно в плоскость XY) для ваших отображений, а затем просто восстановить координаты Z позже.

Единственный раз, когда это нене работает, если исходный многоугольник перпендикулярен плоскости XY, так как получающееся отображение вырождается в линию.

0 голосов
/ 17 мая 2011

Вам понадобится следующая матрица, чтобы изменить координаты вершины с фрейма x0, y0, z0 на x1, y1, z1 и, в конечном итоге, перевод, чтобы происхождение совпадало.

...