Найдите нормальный угол грани треугольника в 3D, учитывая координаты его вершин.

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

screenshot

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

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


person Community    schedule 04.10.2009    source источник
comment
Спасибо, что добавили картинку, я всего лишь гость :-(   -  person    schedule 04.10.2009
comment
Спасибо, ребята, ответ на вопрос!   -  person    schedule 06.10.2009


Ответы (4)


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

p1 - p0

и

p2 - p0

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

лицо, направленное в сторону от камеры лицо, указывающее на камеру

person ChrisF    schedule 04.10.2009

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

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

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

person sdclibbery    schedule 05.10.2009
comment
Если треугольник имеет нулевую площадь, разве вы не определили ни линию, ни точку, которые не являются треугольниками? Это можно поймать с помощью оговорки о защите, не так ли? - person jcolebrand; 05.09.2012

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

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

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

person Incredulous Monk    schedule 06.10.2009

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

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

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

person whatnick    schedule 04.10.2009