Sidebar

Новые компиляторы уровней для Xash3D

ncuxonaT

Well-known member
May 5, 2013
1,221
51
48
2 Дядя Миша: от такой нарезки аксиальных плоскостей не прибавится. Откуда вообще новым плоскостям взяться, если режется плоский треугольник.

Post automatically merged:

2 Raid: так нельзя сделать?
 

Attachments

Last edited:
Staff member
VIP
Mar 28, 2010
15,566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
2 ncuxonaT: какие-то полигоны порождают аксиальные плоскости, вот они-то и используются в первую очередь.
 

ncuxonaT

Well-known member
May 5, 2013
1,221
51
48
2 Дядя Миша: покажи, как нарезать треугольник, чтобы появилась новая плоскость
 

nemyax

тндайпц тра
Staff member
Модератор
Jul 30, 2015
643
25
18
2 ncuxonaT:
Дык в любом месте посеки, будет тебе две плоскости. Или ты о чём?
 

nemyax

тндайпц тра
Staff member
Модератор
Jul 30, 2015
643
25
18
Их всё равно надо положить в разные ветки бинарного дерева.
 

Raid

VIP
VIP
Jul 11, 2006
8,319
33
  • Rocket медаль
2 ncuxonaT:
Можно. Будет правда не строго по сетке, но как показывают наблюдения часто лучше так лишь бы плоскость целая. Компилятор справляется в большинстве случаев. Редактировать просто неудобно, сдвинул вертекс и все. Либо инвалидная структура либо щель.
 
Staff member
VIP
Mar 28, 2010
15,566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
2 ncuxonaT: я боюсь ты или невнимательно читал или вообще не понял принципы работы. Треугольник НИКАК не надо резать для получения аксиальной плоскости, если у треугольника одна из сторон выровнена по XYZ, то в момент создания этого треугольника одна из его секущих будет аксиальной (и перпендикулярна самому треугольнику). Она отправится в общий набор плоскостей, а потом SelectPartition выберет её для сечения в первую очередь, просто потому что она аксиальная. И она разрежет всех соседей, проходящих сквозь эту плоскость. И появятся дополнительные разрубы.
Причём логика самого BSP пересмотру не подлежит, а вот CSG надо исправлять, т.к. он самый глюченый из всех, а глюченый он потому что вальва его отрезала от BSP и с этого всё и началось.
 

ncuxonaT

Well-known member
May 5, 2013
1,221
51
48
То есть выбирается какой-то треугольник и вообще вся геометрия режется плоскостью этого треугольника? При этом в несколько раз вырастает общее количество вершин и треугольников?
А я-то думал, откуда эти странные разрезы.
Неудивительно, что появляются дыры и криво накладываются текстуры. И швы на лайтмапе.
 

Attachments

nemyax

тндайпц тра
Staff member
Модератор
Jul 30, 2015
643
25
18
ncuxonaT said:
и вообще вся геометрия режется плоскостью этого треугольника?
Не вся, а та, что оказалась с одной из сторон режущей плоскости уровнем выше в дереве.
 
Staff member
VIP
Mar 28, 2010
15,566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
Ладно, еще раз по полкам. Это не единственный способ, но один из самых оптимальных. В карте - плоскости. Шесть плоскостей образует браш. Каждая плоскость каждого браша обрезается всеми остальными плоскостями. В итоге получаются реальные вертексы (для примера рассматриваем кубег). Эти брашы подаются на вход CSG. CSG дополнительно вычитает из каждого браша каждый.
Легко заметить что при таком подходе можно получить каждый раз разные результаты, поскольку любое вычитание (неважно чем мы оперируем брашами или числами), критично к положению мест вычитаемых. Поэтому для CSG действует два простых правила - сортировка по контентсам (солиды жрут воду, но вода не может жрать солид) и приоритеты в порядке возрастания номера браша. Т.е. младший в списке номер всегда вычитается из старшего, хотя и не факт, что это всегда правильно. Ну это лирическое отступление по вышеописанной проблеме. Пойдем дальше, когда CSG завершил свою работу у нас больше нет брашей, всё. Только сурфейсы. Точнее браши-то никуда не делись конечно, но уже нет никакого смысла знать какие сурфейсы какому брашу принадлежали (для ку2 ситуация иная, там дерево режет не сурфейсы, а именно браши, но об этом как-нить в другой раз), эти сурфейсы вместе со всеми вертексами натурально дампятся в текстовые файлики, откуда их потом читает BSP. Ну видели наверное файлы mapname.p0, mapname.p1 и так далее. Вот там фейсы всех моделей для каждого хулла свой файлик. При загрузке в BSP они группируются по плоскости. Т.е. все фейсы, имеющие одну плоскость собираются в цепочку. Для ускорения работы. Ну а дальше мы выбираем секущую плоскость из уже имеющихся. BSP не порождает новых плоскостей (технически ему никто не мешает конечно). В определённых случаях, порождается аксиальная плоскость точно посередине карты, это как правило делается на начальных этапах построения, когда на вход подаются все полигоны карты. И здесь BSP ведёт себя именно так как написано в учебниках - разрубает карту пополам. Это необязательно делать, но так зачастую балансировка лучше получается (хотя и глубина рекурсии тоже возрастает, каждый такой разруб даёт явный +1 к глубине и потенциально еще пару неявных). Но зато у нас не получается уродства когда у корневой ноды второй узел ведёт на аутсайдлиф.
Вообщем после такого аксиального разруба уже в дело вступают наши цепочки фейсов с прилинкованными плоскостями. Мы перебираем их все (те, которые остались во второй половине карты после разруба) и выбираем ту плоскость, которая даёт минимальное кол-во новых разбиений, это аналитический процесс.
Не факт что это произойдет именно с аксиальной плоскостью, кстати. Но это напрямую зависит от того как поработал CSG. Но CSG (само вычитание), не порождает новых плоскостей. Только создание самих брашей.
 
Staff member
VIP
Mar 28, 2010
15,566
315
83
Кубань
  • Золотая медаль 215
  • Серебряная медаль 214
  • Золотая медаль 221
  • Cat
Третья часто встречающаяся ошибка — «leaf saw into leaf». Появляется эта ошибка, когда объект как бы смотрит внутрь себя
Ага, если бы только из-за этого...
 

qpAHToMAS

Administrator
Staff member
Администратор
Oct 22, 2006
9,323
33
  • Золотая медаль 215
  • Золотая медаль 152
  • Серебряная медаль 136
  • Золотая медаль 221
Big Boss said:
Дядя Миша, если движке Xash3D или будущих компиляторах такая фича?

А в чем прикол и почему так медленно?
 

Cavador

New member
Dec 8, 2007
1,366
13
0
в сорсе происходит тоже самое.
как мне удалось избавится от артефактов и понизить поли каунт

помните как мы делали что бы колонны, префабы, не резали пол ? мы переводили их в ентити, благо в сорсе есть даже ентитя которая называется func_detail, смотрите на рис, сорян не могу сейчас запустить халфу, что бы продемонстрировать это с поликаунтом и в dev режиме,

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

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

Attachments

qpAHToMAS

Administrator
Staff member
Администратор
Oct 22, 2006
9,323
33
  • Золотая медаль 215
  • Золотая медаль 152
  • Серебряная медаль 136
  • Золотая медаль 221
Це боян же. В GoldSrc также, в первых страницах нубских вопросов CS 1.6 решилось.