Задать вопрос
@ImagineTables

Как отконвертировать 3D-меш в наклонные треугольники?

На входе есть триангулированный 3D-меш, то есть набор треугольников, каждая вершина которого задана тремя координатами:


(x,y,z) — (x,y,z) — (x,y,z)
(x,y,z) — (x,y,z) — (x,y,z)
(x,y,z) — (x,y,z) — (x,y,z)


Это не важно, но для пущей наглядности обозначу: меш получен из прямоугольника, лежащего в горизонтальной плоскости, путём разбиения на квадратные ячейки, ячеек — на два треугольника, и поднятием/опусканием вершин этих треугольников по высоте. То есть, все треугольники смежные и не пересекаются.

На выходе нужно получить набор наклонённых треугольников, то есть таких, которые описаны тремя парами 2D-координат проекций вершин на горизонтальную плоскость, высотой треугольника, и двумя углами:


(x,y) — (x,y) — (x,y) — h — ∠α — ∠β
(x,y) — (x,y) — (x,y) — h — ∠α — ∠β
(x,y) — (x,y) — (x,y) — h — ∠α — ∠β


Изначально мы в горизонтальной плоскости строим проекцию треугольника, для этого используются три пары двухмерных координат. Затем мы по высоте поднимаем/опускаем треугольник целиком. Затем наклоняем треугольник при помощи двух углов.

∠α это угол поворота в горизонтальной плоскости от, допустим, севера. То есть, из начала координат строим отрезок OA на север, затем поворачиваем его по часовой на ∠α, получая отрезок OA`. Затем строим плоскость, перпендикулярную горизонтальной плоскости, и проходящую через отрезок OA`. В этой плоскости и вращаем треугольник на угол ∠β (pivot'ом может быть начало координат или центр, пусть будет начало координат).

Вот скриншот такого треугольника:

avn1fkgvwxh933wzkpqaeidd5a8.png

Очевидно, что (x,y) — (x,y) — (x,y) можно оставить без изменений. Как тройку оставшихся z — z — z конвертировать в h — ∠α — ∠β?
  • Вопрос задан
  • 68 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Вам надо выписать формулы высот вершин в зависимости от высоты и поворотов.
Вообще, не очень понятно как именно ваши повороты происходят. Если вы вращаете треугольник, то координаты xy всех точек тоже меняются. Так что нельзя поднять треугольник и повернуть его, у него площать будет как у плоского, но у наклонного же площадь больше.

Видимо, этими углами и высотой задается плоскость в которой треугольник лежит.

Пусть уравнение плоскости вида Ax+By+Cz+D=0. Тут A,B,C - это нормаль к плоскости. Вы эту плоскость уже знаете - это три ваши точки же. Она от вертикального вектора вверх отличается за счет второго поворота на угол beta. Т.е. вы косинус этого угла можете найти как скалаярное произведение нормали к плоскости и вектора (0,0,1). А угол альфа - тут вам надо спроцировать нормаль плоскости на горизонтальную плоскость и найти угол между этим вектором и (1,0). Не уверен, в какую сторону вы там вращаете и от какого вектора, возможно вам надо будет прибавить 180 или 90 к альфа или бета.

Как считается высота - я не понимаю. Возможно это просто параметр D, Возможно, D*cos(beta).

Естественно, уравнение плоскости - нормированное, чтобы A^2+B^2+C^2 = 1. Можно A,B,C найти взяв векторное произведение двух сторон труегольника, а для D потом подставить координаты одной из трех точек.

Тут в формулах будут использоваться не только 3 координаты z, но вообще все точки. Несколько векторных,скалярных произведений и пара арккосинусов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы