Найти нормальный угол лица треугольника в 3D, учитывая координаты его вершин
Как вы можете сказать из этот скриншот, я пытаюсь сделать физический движок для платформы, над которой я работаю, но я столкнулся с определенной проблемой: мне нужно выяснить угол любого из треугольников, которые вы видите, чтобы составить эту сетку, чтобы я мог развернуть вращение, и поэтому angular ускорение игрока на этом треугольнике.
![screenshot]()
Я могу использовать алгоритм, который я создал, чтобы найти местоположения всех трех точек любого треугольника, с которым игрок взаимодействует, но я не знаю, как использовать эти точки для разработки вращения треугольника.
Под поворотом я имею в виду направление нормали от центра лица, то есть угол, на котором человек будет наклоняться, если они будут стоять на этой поверхности. Может ли кто-нибудь придумать серию уравнений, которые позволят решить эту проблему?
Ответы
Ответ 1
Если вы берете произведение двух векторов:
p1 - p0
и
p2 - p0
где p0
, p1
и p2
- три вершины треугольника, вы получите нормальное значение. Треугольник считается направленным на вас, если вершины упорядочены по часовой стрелке относительно своей внешней нормали. Это называется правилом левой руки. Представьте, что удерживая левую руку пальцами, свернутыми от p0
до p1
, ваш палец торчит в направлении лица нормальным:
![face pointing away from camera]()
![face pointing towards camera]()
Ответ 2
Перекрестное произведение - правильный ответ. Не забывайте нормализовать результат и не забывайте, что если треугольник имеет нулевую область, результат недействителен, потому что нет четко определенного нормального. В принципе, если ваши три вершины p0, p1 и p2:
vector temp = cross(p1 - p0, p2 - p0);
if (length(temp) < epsilon) then
Degenerate_triangle_error;
else
return normalize(temp);
Кроме того, как говорит другой ответ, независимо от того, получите ли вы "обратный" или "вниз", будет зависеть от упорядочения ваших вершин.
Ответ 3
Чтобы закончить ответ на ваш вопрос, как только у вас есть нормальный вектор вашего треугольника, вы можете выработать угол, используя точечный продукт.
Точечное произведение двух единичных векторов равно косинусу угла между ними, поэтому, если вы вычисляете arccos точечного произведения вашего нормального вектора вашего устройства и вашего юнита Up vector, вы получите угол наклона вашего треугольника (угол от горизонтали).
Также обратите внимание, что OpenGL традиционно использует правую систему координат, поэтому, если вы используете это, то ваши треугольные вершины будут иметь порядок против часовой стрелки.
Ответ 4
Есть два нормали к треугольнику (конечно), и тот, который вы получаете от стандартных алгоритмов, зависит от порядка вершин. Цитирование wiki
"Для многоугольника (такого как треугольник) нормаль поверхности может быть вычислена как векторное поперечное произведение двух (непараллельных) ребер многоугольника."
Но направление нормали зависит от порядка выбранных точек, вы можете рассчитать его и решить с помощью какой-либо другой эвристики, является ли обратный вектор нормальным, который вас интересует.