Sidebar

Тени на модели

S=v=M

New member
25.08.06
11
38
Тени на модели

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

Вкладення

VIP
12.08.04
18 877
462
83
  • Бронзовая медаль 103
  • Деревянный домик Скааржа
  • Серебряная медаль 213
  • Золотая медаль 136
  • Бронзовая медаль 141
  • Серебряная медаль 125
  • Золотая медаль 221
  • Золотая медаль 213
  • Золотая медаль 232
  • Серебряная медаль 132
Вывернуты нормали неторых треугольников.

Post automatically merged:

Или неправильные группы сглаживания, что более вероятно.
 
Останнє редагування:

M@K$

DJ
31.10.05
1 540
42
  • Золотая медаль 131
Нужно всю плоскость сделать хард-эджами в майке, либо в максе указать группу сглаживания одну для всей плоскости. В милке х\з ... в ней только начинающие моделят... если хочешь я тебе могу сделать высылай исходик на мыло мне... [email protected]
 

[CCCP] Monster

New member
01.07.06
61
0
0
Сейчас объясню.

Для начала расскажу, что ты сделал. Ты намоделил в Максе фургончик, сохранил его как 3дс и открыл в Милке. Либо сразу сделал в Милке и назначил одну группу сглаживания для всей модели. Это неправильно.

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

Аппаратное ускорение прорисовки трехмерной векторной графики основано на вершинах и треугольниках. Вершины задаются вершинными буферами, треугольники - индексными. В вершинном буфере хранятся данные обо всех вершинах, а каждая вершина обладает координатами по всем трем осям, координатами текстур, единичными векторами нормалей, возможно, цветом и ссылкой на текстуру, которой покрыт объект. Индексный буфер содержит номера вершин из вершинного буфера для рисования треугольников. Логично, что количество индексов в индексном дуфере должно быть кратно 3-м, т.к. треугольник состоит из трех вершин.

Нас интересует направление единичного вектора нормалей для каждой вершины. И проблема тут вот в чем. Для математической реализации затенения по методу Гуро, которое скрывается под названием Smooth Shadding практически во всех трехмерных редакторах и реализуется во всех играх, необходимо оперировать нормалями (т.е. перпендикулярами) к треугольникам. НО! В аппаратной реализации этого метода затенения нормали задаются для каждой вершины! Как же быть с таким несоответствием? А все просто! Для правильного затенения, например, плоского четырехугольника, нужно чтобы нормали всех вершин совпадали по направлению с нормалью к треугольникам. Но мы опять упираемся в проблему. Что если одна вершина является основанием для нескольких соседних треугольников? Оказывается тут тоже все просто. Нормали в таких точках усредняются. Это значит, что вычисляется вектор, являющийся векторной суммой векторов всех нормалей, которым принадлежит данная вершина. Затем мы полученный вектор нормализуем и используем. Но тут опять проблема!!! А что делать с такими случаями, когда вершина находится на углу, и при этом два соседних с этой вершиной треугольника находятся под прямым или острым углом друг к другу, изображая, например, стенку, или проем в кузове, как у автора? В стандартном случае после усреднения нормаль будет смотреть совсем не туда, куда хотелось бы. И затенение будет неправлильным. Как раз такая неправильная вершина показана красным кружком.

Теперь тоже самое, но чуть нагляднее.
На первой врезке то, как должна выглядеть стенка кунга машины. Синим показаны нормали. На втором показана как раз ситауция автора темы, где нормали усреднены. Делая вывод из всего вышесказанного сообщу, что система сэкономила на количестве растеризуемых вершин, пожертвовав реалистичностью освещения. А если мы не хотим жертовать? Как быть тогда? А очень просто, ведь для этого придумали группы сглаживания. Их всего 32 штуки, и они характеризуют как раз такие места, которые должны отличаться друг от друга по затенению. В частности, так должны отличаться друг от друга две поверхности кубика, или стены, находящиеся под углом в 90 градусов друг относительно друга. Они должны принадлежать к РАЗНЫМ ГРУППАМ СГЛАЖИВАНИЯ.

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

Удачи!

З.Ы. Такую длинную тираду я изверг не потому что люблю лекции читать, а потому что те, кто моделит, должны понимать механизмы рендеринга того, что они моделят, иначе будут вот такие вот глупые вопросы возникать. Не поленитесь и перечитайте, если не прочитали или не поняли. Потому как при возникновении вопроса по группам сглаживания, или касаущиеся групп сглаживания, буду посылать далеко, т.е. сюда. А вообще хорошо бы вам почитать SDK DirectX. Тогда поймете, откуда у трехмерной графики растут ноги.
 

Вкладення

Останнє редагування:

PHombie

Зерги не перелетают
21.08.06
4 278
35
5
0
Киев
Очень интерестная лекция, а темболие бессплатная, спасибо
 
VIP
12.08.04
18 877
462
83
  • Бронзовая медаль 103
  • Деревянный домик Скааржа
  • Серебряная медаль 213
  • Золотая медаль 136
  • Бронзовая медаль 141
  • Серебряная медаль 125
  • Золотая медаль 221
  • Золотая медаль 213
  • Золотая медаль 232
  • Серебряная медаль 132
2 Пряный Кот:
Значит соседние полигоны не имеют общее ребро, велди вертексы. :)
 

Bl@cK

Солдатный старшина
17.02.07
108
1
0
Пряный Кот сказав(ла):
2 [CCCP] Monster:
Эх, когда же придут светлые времена, когда в графических API будет использоваться модель Фонга, а не Гуро...
Плизз, подробнее, я записываю
 

Game Server

Доноры Красавчики

Користувачі онлайн