Найти нормальный угол грани треугольника в 3D, учитывая координаты его вершин - PullRequest
14 голосов
/ 04 октября 2009

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

screenshot

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

Под вращением я подразумеваю направление нормали от центра лица, то есть угол, под которым человек наклонился бы, если бы он стоял на этой поверхности. Может кто-нибудь придумать ряд уравнений, которые позволят решить эту проблему?

Ответы [ 4 ]

34 голосов
/ 04 октября 2009

Если вы берете перекрестное произведение двух векторов:

p1 - p0

и

p2 - p0

, где p0, p1 и p2 - три вершины треугольника, вы получите нормаль. Треугольник считается направленным на вас, если вершины упорядочены по часовой стрелке относительно его внешней нормали. Это называется правилом левой руки. Представьте, что вы держите левую руку пальцами, изогнутыми от p0 до p1, большой палец торчит в направлении лица, нормального:

face pointing away from camera face pointing towards camera

10 голосов
/ 05 октября 2009

перекрестный продукт является правильным ответом. Не забудьте нормализовать результат, и не забывайте, что если треугольник имеет нулевую площадь, результат недопустим, потому что нет четко определенной нормали. В основном, если ваши три вершины p0, p1 и p2:

vector temp = cross(p1 - p0, p2 - p0);
if (length(temp) < epsilon) then
    Degenerate_triangle_error;
else
    return normalize(temp);

Кроме того, как говорится в другом ответе, то, будет ли у вас нормаль "вверх" или "вниз", будет зависеть от упорядочения ваших вершин.

3 голосов
/ 06 октября 2009

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

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

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

2 голосов
/ 04 октября 2009

Есть 2 нормали к треугольнику (конечно), и та, которую вы получите из стандартных алгоритмов, зависит от порядка вершин. Цитирование вики

"Для многоугольника (такого как треугольник) нормаль поверхности может быть рассчитана как векторное произведение двух (непараллельных) ребер многоугольника."

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

...