Убедитесь, что ваши нормали имеют единичную длину (при необходимости разделите на их длину).Затем найдите скалярное произведение.
dp = n1.x*n2.x + n1.y*n2.y + n1.z*n2.z
Это даст значение в [от -1 до 1].
Если dp отрицательно, угол больше 90 градусов.
Чтобы найти угол, используйте арккосинус.
θ = acos(dp);
Это даст вам значение в радианах.Чтобы преобразовать в градусы, умножьте на 180 / pi.
Редактировать: Предположим, что грани определены как многоугольники.Если грани не копланарны, в определении полигона каждой грани должна быть одна точка, которая не копланарна с другим полигоном.Рассмотрим два треугольника: если одно ребро соединено, они разделяют две вершины, но у каждого есть одна не общая вершина.Я назову эти v1 и v2 , связанные соответственно с нормалями n1 и n2 .Найдите вектор от v1 до v2 :
m = v2-v1
Если угол между m и n1 большечем 90 [ dotP (m, n1) <0 </strong>], то полигоны обращены друг от друга.Если угол меньше 90, многоугольники обращены друг к другу.Если угол составляет 90 градусов, то я думаю, что многоугольники копланарны (или одна из выбранных вами точек находится на линии плоского пересечения, или я пропустил случай в своем мышлении).