forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Как сделать правильнее (http://forum.boolean.name/showthread.php?t=16203)

Colossus 17.01.2012 03:36

Как сделать правильнее
 
делал на досуге "декали" дырок от попадания пуль в обьект, и столкнулся с проблемой - когда попадаешь в ребро модели так сказать, то спрайт как бы торчит из нее:


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

если кому не лень накатайте примерчик чтоли:)

заранее благодарен

ABTOMAT 17.01.2012 03:49

Ответ: Как сделать правильнее
 
По-хорошему деколь копирует часть поверхности, на которой лежит.
Так что тебе придётся брать треугольник, на который попала декаль и проверять, не выходит ли декаль за его пределы. Если выходит - обрезать.
Другой вариант - сразу копировать треугольники, которые "попадают" под деколь и обрезать их, формируя из них саму деколь.
Примерчик сложно и долго.

Ну естественно можно придумать и другие способы, менее качественные, но более простые :)

Colossus 17.01.2012 03:58

Ответ: Как сделать правильнее
 
вот мне желательно попроще бы ))

Crayzi 17.01.2012 09:08

Ответ: Как сделать правильнее
 
А пробовал попытатся на текстуре рисовать? Мож так проще... Это так, мысли вслух)

SBJoker 17.01.2012 11:07

Ответ: Как сделать правильнее
 
В Half-Life 2 декали рисовались так чтобы не попадать на изломы поверхности. Т.е. при стрельбе точно в угол здания деколь рисовалась на одной из сторон угла на расстоянии от угла так чтобы она сама не вылезала за стену. Если же места для размещения деколи недостаточно (например небольшая полоска стены между трубами) то там деколь не создаётся.

Вот так было сделано в одной из лучших игр, думайте сами надо ли вам делать деколи честнее.

Crayzi 17.01.2012 11:35

Ответ: Как сделать правильнее
 
Цитата:

Сообщение от SBJoker (Сообщение 217030)
В Half-Life 2 декали рисовались так чтобы не попадать на изломы поверхности. Т.е. при стрельбе точно в угол здания деколь рисовалась на одной из сторон угла на расстоянии от угла так чтобы она сама не вылезала за стену. Если же места для размещения деколи недостаточно (например небольшая полоска стены между трубами) то там деколь не создаётся.

Вот так было сделано в одной из лучших игр, думайте сами надо ли вам делать деколи честнее.

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

Colossus 17.01.2012 12:01

Ответ: Как сделать правильнее
 
тогда как узнать можно ли рисовать декаль или нельзя? тоесть как узнать как близко до "излома" чтобы было условие - рисовать\не рисовать декаль

ABTOMAT 17.01.2012 12:37

Ответ: Как сделать правильнее
 
Тоже хотел предложить, но
Цитата:

Сообщение от SBJoker (Сообщение 217030)
Т.е. при стрельбе точно в угол здания деколь рисовалась на одной из сторон угла на расстоянии от угла так чтобы она сама не вылезала за стену.

О, рилли? В самой лучшей игре делали как раз как положено.

Непосредственно Half-Life 2 на компе не оказалось, но в CS:S деколи точно такие же.
Кстати то, что ты говоришь, по-моему, было в Hlaf-Life 1

ABTOMAT 17.01.2012 12:42

Ответ: Как сделать правильнее
 
Цитата:

Сообщение от Colossus (Сообщение 217033)
тогда как узнать можно ли рисовать декаль или нельзя? тоесть как узнать как близко до "излома" чтобы было условие - рисовать\не рисовать декаль

Перевести треугольник, на который попала деколь, в систему координат его нормали. Перевести в неё же деколь (её два треугольника). Проверить, не пересекает ли хоть 1 линия деколи хоть 1 линию треугольника. Пересекает = будет вылезать за пределы. На этом можно остановиться и просто не рисовать деколь.
Можно пойти дальше, и сдвинуть деколь перпендикулярно пересекаемой линии на длину наиболее выступающего участка (тригонометрия во все поля).
Сделать такую же проверку после этого. Если он пересекает теперь уже что-то другое, то не создавать.

Colossus 17.01.2012 15:15

Ответ: Как сделать правильнее
 
то что ты написал, для меня все равно что букварь на японском...

MadMedic 17.01.2012 15:55

Re: Ответ: Как сделать правильнее
 
Цитата:

то что ты написал, для меня все равно что букварь на японском...
Оставь как делал раньше и не парься:
Цитата:

делал на досуге "декали" дырок от попадания пуль в обьект, и столкнулся с проблемой - когда попадаешь в ребро модели так сказать, то спрайт как бы торчит из нее:

reumep 17.01.2012 16:34

Ответ: Re: Ответ: Как сделать правильнее
 
Цитата:

Свойства изображения: 1.4МБ
я опять скачал дискету

SBJoker 17.01.2012 18:31

Ответ: Как сделать правильнее
 
Цитата:

Сообщение от ABTOMAT (Сообщение 217035)
Тоже хотел предложить, но

О, рилли? В самой лучшей игре делали как раз как положено.

Непосредственно Half-Life 2 на компе не оказалось, но в CS:S деколи точно такие же.
Кстати то, что ты говоришь, по-моему, было в Hlaf-Life 1

В тот время когда я играл в half-Life 2, на уровне про тюрьму, наблюдал такое поведение воочию чем долго развлекался.
Возможжно с других версиях игры или модах пофиксили.

Кроме того в Unreal Tournament 2004 аналогично. Хотя там декали умели иногда завернуть за угол. Принцип изменения поведения неизучен. Скорее всего для заворачивающих декалей кое где используется мультитекстурирование с занесением в текстуру соответствующих изображений. И эти спец слои предусмотрены не везде. Кстати возможно и в халве так же, гдето на видном месте заворачивают, а где то нет.

ABTOMAT 17.01.2012 18:49

Ответ: Как сделать правильнее
 
Вложений: 1
Цитата:

Сообщение от SBJoker (Сообщение 217078)
В тот время когда я играл в half-Life 2, на уровне про тюрьму, наблюдал такое поведение воочию чем долго развлекался.
Возможжно с других версиях игры или модах пофиксили.

Кроме того в Unreal Tournament 2004 аналогично. Хотя там декали умели иногда завернуть за угол. Принцип изменения поведения неизучен. Скорее всего для заворачивающих декалей кое где используется мультитекстурирование с занесением в текстуру соответствующих изображений. И эти спец слои предусмотрены не везде. Кстати возможно и в халве так же, гдето на видном месте заворачивают, а где то нет.

Ок, вот вам скрин из HL2, из уровня Nova Prospect. Проблемы?

SBJoker 17.01.2012 20:31

Ответ: Как сделать правильнее
 
Действительно установил запутсил всё ок. Значит то я ещё в бету играл.

Colossus 17.01.2012 22:30

Ответ: Как сделать правильнее
 
буду изучать говнорисование в текстуру

Mr_F_ 17.01.2012 23:08

Ответ: Как сделать правильнее
 
да это вообще беспонтовый способ, т.к. текстур не напасёшься на весь уровень.
я делал декали аля хл2, остался код на ксорсе/с++, но он слишком уж говнокод, так что смысла постить его особо нет, в теории работало так:


- мы выстрелили в объект, у нас есть позиция появления декали и нормаль поверхности в этом месте/альтернативно это может быть нормаль полёта пули.
- представляем 4 бесконечных плоскости, равноудалённые от позиции дырки и образующие квадрат размером с декаль, если смотреть в направлении нормали. т.е. по сути это квадрат в пространстве нормали, но вытянутый в глубину бесконечно.
- находим все треугольника объекта, попадающие внутрь этих плоскостей, по дистанции и разнице нормалей ещё можно отсеять повернутые обратной стороной трианглы или слишком далёкие от точки попадания.
- обрезаем найденные трианглы нашими 4мя плоскостями и отодвигаем их чуть-чуть в направлении их нормалей (чтобы избежать z-fighting)
- в пространстве нормали считаем планарные UV на трианглы (там тупо U=X, V=Y + нормализация)
- рисуем полученный меш

- можно объединять все декали одного типа на одном объекте в один меш
- можно не обрезать трианглы и не считать UV, а получать UV в пиксельном шейдере + юзать режим аддресации BORDER, но это потенциально ведёт к overdraw + не особо позволяет сфигачить кучу декалей в 1 меш.

- можно юзать deferred decals (?? не пробовал)

- вышенаписанная фигня про треугольники можнт звучать МЕДЛЕННО, но на практике работало, и я не замечал снижения фпс ваще.

Colossus 19.01.2012 09:09

Ответ: Как сделать правильнее
 
дабы не постить 100500 тем, спрошу сдесь же - как можно увеличить громкость 3dsound в блице? а то сделал 3д звук, а он какой то тихи даже вблизи... не я конечно знаю о команде
Код:

SoundVolume
но все равно тихо, что посоветуете?

Платон Александрович 19.01.2012 12:03

Ответ: Как сделать правильнее
 
интересная тема :)

Mr_F_ +1

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

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

кстати по поводу способа с копированием и обрезкой геометрии, там тоже проблем полно, например

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

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

ЗЫ
Цитата:

представляем 4 бесконечных плоскости, равноудалённые от позиции дырки и образующие квадрат
кстати по рисунку также можно понять почему резать лучше боксом, а не квадратом

Nerd 19.01.2012 14:15

Ответ: Как сделать правильнее
 
Цитата:

Сообщение от Colossus (Сообщение 217205)
как можно увеличить громкость 3dsound в блице? а то сделал 3д звук, а он какой то тихи даже вблизи... не я конечно знаю о команде
Код:

SoundVolume
но все равно тихо, что посоветуете?

1. - изменить сам файл.
2. - поиграться с параметрами CreateListener

Mr_F_ 19.01.2012 14:30

Ответ: Как сделать правильнее
 
Цитата:

кстати по рисунку также можно понять почему резать лучше боксом, а не квадратом
ээ я не очень понял. у тебя картинка вроде сбоку? т.е. декаль как бы там проецируется сверху слева вниз вправо? короче оно бы и квадратом так же обрезалось бы.

а насчёт обозначенной на картинке проблемы - да, не подумал о таком.
интересно найти решение.
в голову приходит только безумный вариант - т.к. проблема аналогична проблеме освещения при отсутствии теней, можно в крохотном разрешении (типа 32х32) растеризовать все отобранные треугольники с позиции прожектора декали, рисуя в 2д массив глубину (как при software occlusion culling) и потом сравнить все трианглы с записанной глубиной, узнав, есть ли перекрытие (отсеяв то, что у тебя на картинке красное).
но это чёто уже черезчур тормозно звучит)

Платон Александрович 19.01.2012 16:15

Ответ: Как сделать правильнее
 
Цитата:

Сообщение от Mr_F_ (Сообщение 217217)
ээ я не очень понял. у тебя картинка вроде сбоку?

Ага, сбоку
Цитата:

Сообщение от Mr_F_ (Сообщение 217217)
т.е. декаль как бы там проецируется сверху слева вниз вправо?

Вообще только сверху (пикнули в зеленой точке и проекция по нормали пола), но т.к. декаль заходит частично на стену, то и на нее нужно тоже.
Цитата:

Сообщение от Mr_F_ (Сообщение 217217)
короче оно бы и квадратом так же обрезалось бы.

Не, тогда бы по вертикали скопировалась вся стена (плоскости же бесконечны по нормали), вот примерно как на картинке, в 3д лучше будет видно
так же как и на предыдущей картинке точка пика, 4 плоскости квадрата в пространстве нормали и получаемые вертексы

а если боксом, то стена и по вертикали обрежется как раз по размеру декаля
Хотя может лучше тогда брать плоскости по вектору пика? Но опять таки если пикнем сверху получим такую же картину :(
Цитата:

Сообщение от Mr_F_ (Сообщение 217217)
в голову приходит только безумный вариант - т.к. проблема аналогична проблеме освещения при отсутствии теней, можно в крохотном разрешении (типа 32х32) растеризовать все отобранные треугольники с позиции прожектора декали, рисуя в 2д массив глубину (как при software occlusion culling) и потом сравнить все трианглы с записанной глубиной, узнав, есть ли перекрытие (отсеяв то, что у тебя на картинке красное).
но это чёто уже черезчур тормозно звучит)

Ну тогда уж volume декали юзать :) кажись у Хумуса эту технику видел. Только вот к блицу это не применимо к сожалению, надо как-то по другому извращаться :)
ЗЫ
Точно у хумуса, третья снизу

Mr_F_ 19.01.2012 20:13

Ответ: Как сделать правильнее
 
гляжу, в UE тоже боксом:
http://udn.epicgames.com/Three/UsingDecals.html

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


Часовой пояс GMT +4, время: 21:54.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot