найти угол между гранями от лица нормали - PullRequest
5 голосов
/ 18 марта 2011

У меня есть некоторые нормали лица, и мне нужно вычислить угол между гранями, которым они принадлежат.У меня проблема с нахождением углов между гранями, когда угол больше 180 - я не могу понять, как определить разницу между углом 45 и углом 315.

edit2:У меня есть доступ к файлу obj, определяющему модель, какую информацию мне нужно различать между 45 'и 315'?Кроме того, я строю используемые (низкополигональные) модели, поэтому могу гарантировать отсутствие пересекающихся граней и т. Д.

edit:

ang = math.acos(dotproduct(v1, v2) / (length(v1) * length(v2)))

ang = math.degrees(ang)

ang = 360 - (ang + 180)

1 Ответ

8 голосов
/ 18 марта 2011

Убедитесь, что ваши нормали имеют единичную длину (при необходимости разделите на их длину).Затем найдите скалярное произведение.

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 градусов, то я думаю, что многоугольники копланарны (или одна из выбранных вами точек находится на линии плоского пересечения, или я пропустил случай в своем мышлении).

...