Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: CommunityОтветов: 4

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

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

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

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

trigonometry3dmathgeometry

Ответы

Ответ 1 · рейтинг 34 · ChrisF

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

p1 - p0

и

p2 - p0

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

Ответ 2 · рейтинг 10 · sdclibbery

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

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

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

Ответ 3 · рейтинг 3 · Incredulous Monk

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

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

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

Ответ 4 · рейтинг 2 · whatnick

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы