На входе есть триангулированный 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'ом может быть начало координат или центр, пусть будет начало координат).
Вот скриншот такого треугольника:
Очевидно, что (x,y) — (x,y) — (x,y) можно оставить без изменений. Как тройку оставшихся z — z — z конвертировать в h — ∠α — ∠β?