2012-05-21 4 views
3

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

Однако я не совсем уверен, как 3D-моделирующие программы, такие как Blender, могут взять произвольную группу треугольников и правильно направить их все.

Я попытался прибегая к помощи ответ, и это было лучшее, что я нашел:

http://www.gamedev.net/topic/550481-vertex-winding-order-counter-clockwise-oder-vertex---algorithm/

В принципе, для каждого треугольника, вы найдете его центр (барицентр быть точным), вычислить вектор нормали из этого треугольника , который дает вам луч. Вы берете этот луч и проверяете его против пересечения с любым другим треугольником. Если это четное число, то ваша обмотка правильная, если это нечетное число, ваша обмотка неверна (я полагаю, это зависит от того, как именно вы создали нормальный вектор, но каким-то образом вы используете стратегию «нечетные/четные»). В любом случае, это означает, что весь этот процесс, как правило, O (n^2). Если у вас 1000 треугольников, то для каждого треугольника вы должны проверить его на пересечение для 999 других треугольников. Существует ли менее очевидный способ правильного ветвления вершин, что более эффективно?

+1

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

+0

Да, когда вы экспортируете сетку для какой-либо системы рендеринга, она имеет правильный порядок намотки. Но как этот 3d-модельер сначала определит правильный порядок намотки? – newprogrammer

ответ

3

Вы не поняли, что это неправильно. Это не

test it against intersection against every other triangle. 

Прежде всего, вы можете ориентироваться (намотка) ваши треугольники, основанные исключительно на вектор нормали к поверхности треугольника. Тогда есть только два варианта слева - вся модель является хорошим или переворачивается;)

Итак, вы действительно должны проверить только ONE треугольник, а затем наматывать остальное основывая на результатах работы последняя проверка, которая в основном дает вам O (n).

EDIT: О, я думаю, я знаю, когда этот подход может потерпеть неудачу. Я просто вспомнил, что, например, Google Sketchup не очень хорошо работает, и иногда вам нужно ориентировать лица самостоятельно. Однако, если вы увеличиваете количество случайных лучей (для случайных треугольников), вы действительно увеличите свой шанс правильно маркировать.

EDIT2: А до какой-то 50к + парень downvotes меня к земле - Если модель полностью перепутаны (все треугольники в случайном порядке), нет другого пути ориентировать все из них должным образом, чем проверка их все против другого, исключая выпуклые модели.

+1

Упоминание остального на основе этого первого треугольника имеет смысл, но как 3d модельер выберет правильную обмотку для этого первого треугольника, как, как он вычислит этот первоначальный первый нормальный вектор? – newprogrammer

+0

. Мой подход взял ваш первый метод - литье луча для одного произвольного треугольника и проверку # пересечений. Это дает вам 1000 чеков, поэтому сложность остается O (n). В старой моей книге была глава об этом, в которой предлагалось просто отобразить модель и проверить, нормально ли это или перевернуто ... –

+0

Также посмотрите http://math.stackexchange.com/questions/109553/ ordering-vertices-in-counter-clockwise-way-in-3d-space –

Смежные вопросы