HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Декали и анимация (https://hlfx.ru/forum/showthread.php?threadid=5010)
Отправлено Jerry 10-06-2017 в 16:00:
Декали и анимация
Как в hl1 происходит наложение декалей?
прошу объяснить просто алгоритм (как трассировать пулю, и найти поверхность на которую надо наложить( в контексте не измененной структуры bsp файла).
Я смотрел исходники xash но толком не чего не понял.
Также интересует как работает анимация в hl2.
К примеру я хочу взять анимацию одного из игроков cs:s, с геометрией проблем нет, а вот вся(наверное вся. мне бы хоть ее вытащить) анимация лежит в файле cs_player_shared.
Так вот. Как я понял анимацию там надо смешивать.
К примеру:
- walk_lower(из 9 разных анимаций выбираются четыре, они смешиваются)
- Walk_BodyOffset_FAMAS
- Walk_Aim_FAMAS
- Walk_HandPos_FAMAS
Вот только как?
И как декомпилировать?
К примеру mdldecompiler разбирает в мало связные данные.
Crowbar декомпилит лучше( там хотя бы weightlist есть, с ними можно часть анимаций восстановить ).
Вся проблема( на данный момент ) в delta(subtract).
Crowbar вообще не создает его, в mdldecompiler есть некий файл mdldecompiler_delta.smd(вроде так), но что с ним делать не ясно.
Плюс ко всему файлы smd исполюзующие subtrac Отличаются в Crowbar'е и mdldecompil'е.
Прошу ответить, хочу доделать проект.
Добавлено 10-06-2017 в 18:14:
К примеру я определили плоскость с которой пересекается трассирующая линия.
В том месте определил конечную точку( функция pm_trace.c/PM_RecursiveHullCheck в Xash ).
Рисую на ней декаль.
Декаль на расстоянии находится( как будто это дополнительная невидимая плоскость ).
Перебираются только clipnodes (из бсп карты).
Как определить видимую поверхность?
Добавлено 10-06-2017 в 19:00:
С декалями я вроде разобрался.
Нужно было перебирать nodes а не clipnodes.
И в коде
C++ Source Code:
if ( map.bsp.leafs[ ~nodeIndex ].contents !== CONTENTS_SOLID ) {} |
вместо
C++ Source Code:
if ( nodeIndex !== CONTENTS_SOLID ) {} |
В остальном же все также как и в PM_RecursiveHullCheck
Отправлено Дядя Миша 10-06-2017 в 16:06:
Цитата:
Jerry писал:
Как в hl1 происходит наложение декалей?
Находится поверхность, создаётся полигон, размерами с декаль, потом обрезается плоскостями, чтобы куски декали не висели в воздухе. Кол-во полигонов при этом увеличивается. Поэтому лимит в 4096 декалей - он для всех фрагментов, а не для каждой отдельной. Впрочем мелкие декали обычно занимают один фрагмент. Нужная поверхность находится рекурсивным поиском по бинарному дереву. Но я почти уверен, что ты хотел узнать что-то другое.
Цитата:
Jerry писал:
Также как работает анимация в hl2.
Да точно так же как и в hl2 + свежие навороты, типа инверсной кинематики, дельты.
Цитата:
Jerry писал:
Вся проблема( на данный момент ) в delta(subtract).
Это нерешаемая проблема на уровне декомпиляции. Дельта - это когда из какой-то анимации вычли базовую. Упоминание о базовой анимации в модель не попадает. То есть в готовой модели у нас есть дельта-анимация, из которой вычли какую-то. Какая это анимация - никто не знает. Ну можно предположить, что idle, но это далеко не всегда верно. Может и BindPose. Чтобы лучше понять суть - допустим у нас есть число 42, которое получено в результате вычитания одного числа из другого.
Но мы никак не сможем узнать каким было второе число, поскольку не знаем и первого. Уравнение с двумя неизвестными имеют бесконечное множество решений, которые с точки зрения математики будут верными.
Цитата:
Jerry писал:
И как декомпилировать?
ДА НЕ КАК
Добавлено 10-06-2017 в 19:06:
Цитата:
Jerry писал:
Нужно было перебирать nodes а не clipnodes.
Nodes это точечный хулл, он копируется в clipnodes[0].__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Jerry 11-06-2017 в 15:08:
Дядя Миша Спасибо.
Цитата:
Дядя Миша писал:
Это нерешаемая проблема на уровне декомпиляции. Дельта - это когда из какой-то анимации вычли базовую. Упоминание о базовой анимации в модель не попадает. То есть в готовой модели у нас есть дельта-анимация, из которой вычли какую-то. Какая это анимация - никто не знает. Ну можно предположить, что idle, но это далеко не всегда верно. Может и BindPose. Чтобы лучше понять суть - допустим у нас есть число 42, которое получено в результате вычитания одного числа из другого.
Но мы никак не сможем узнать каким было второе число, поскольку не знаем и первого. Уравнение с двумя неизвестными имеют бесконечное множество решений, которые с точки зрения математики будут верными.
Думаю вы не полностью поняли что я хочу.
Мне не нужно иметь оригинальный смд.
Можно уже и с вычтенной анимацией.
Я хотел узнать как его использовать.( как использовать от mdldecompilera или от crowbar).
На данный момент я открываю в моделвьювере модель, ставлю анимацию с delta subtrac( например Walk_Aim_FAMAS ) и вижу совсем другое, нежели в своем вьювере.
Добавлено 11-06-2017 в 18:08:
Притом что остальные(walk_lower, Jump , Run_lower и т.д., а также бленд из ( walk_lower + Walk_BodyOffset_FAMAS )) воспроизводятся нормально
Отправлено tolerance 11-06-2017 в 15:42:
Цитата:
Дядя Миша писал:
Находится поверхность, создаётся полигон
А gl_polyoffset? Ну, типа когда полигон декали "оттодвинут" от полигона мапы.
Отправлено Дядя Миша 12-06-2017 в 13:29:
Цитата:
Jerry писал:
Я хотел узнать как его использовать.( как использовать от mdldecompilera или от crowbar).
Попробуй модификатор delta.
tolerance это просто чтобы обойти погрешность з-буффера.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Jerry 13-06-2017 в 06:55:
Цитата:
Дядя Миша писал:
Попробуй модификатор delta.
Опять вы меня не поняли.
Я пишу свой вьювер(куда там delta'у ставить? )
Мне нужно узнать алгоритм смешивания этой (вычтенной , или из нее надо вычесть текущую и т.д. ) анимации с другими.
Т.к. даже просто анимация без смешивания не соответствует анимации в hlmv я и думаю что дело в substrac( что декомпиляторы не всю информацию достают , или формат информации таков, что не может быть сохранен в smd(даже с модификациями из qc(вроде weightlist ) ) ).
Отправлено Дядя Миша 13-06-2017 в 13:55:
Цитата:
Jerry писал:
Я пишу свой вьювер(куда там delta'у ставить?
Эпидемия прямо на вьюверы. Я вот тоже свой написал. И разработал новый формат моделей, совместимый с голдсорсом, смотреть тут. Так что по счастливому стечению обстоятельств, я про эту дельту как раз таки в курсе.
Цитата:
Jerry писал:
Мне нужно узнать алгоритм смешивания этой (вычтенной , или из нее надо вычесть текущую и т.д. ) анимации с другими.
в hl2_sdk есть файлег public\bone_setup.cpp и там наглядно, как смешивать дельта-анимации с обычными. Гуглить по слову STUDIO_DELTA и STUDIO_ANIM_DELTA. Если в крации - обычная анимация полностью оверрайдит дефолтные значения костей, а дельта прибавляется к ним.
Но тут еще один ньюанс - ни кровбар ни кэннонфодер нормально эту дельту не извлекают из модельки. То есть декомпил-компил портит модель однозначно.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Jerry 13-06-2017 в 18:32:
Цитата:
Дядя Миша писал:
в hl2_sdk есть файлег public\bone_setup.cpp и там наглядно, как смешивать дельта-анимации с обычными. Гуглить по слову STUDIO_DELTA и STUDIO_ANIM_DELTA. Если в крации - обычная анимация полностью оверрайдит дефолтные значения костей, а дельта прибавляется к ним.
Спасибо(пойду читать, думаю то что надо).
Цитата:
Дядя Миша писал:
Но тут еще один ньюанс - ни кровбар ни кэннонфодер нормально эту дельту не извлекают из модельки. То есть декомпил-компил портит модель однозначно.
Иными словами не существует декомпилятора который бы восстанавливал эту дельту и мне надо самому парсить mdl так?
Добавлено 13-06-2017 в 21:32:
Цитата:
Дядя Миша писал:
Эпидемия прямо на вьюверы. Я вот тоже свой написал. И разработал новый формат моделей, совместимый с голдсорсом, смотреть тут. Так что по счастливому стечению обстоятельств, я про эту дельту как раз таки в курсе.
Я пишу мини игру(типа cs, думаю взять карту из cs1.6, а модели игроков/оружия из cs:s) для браузера.
Отправлено Дядя Миша 13-06-2017 в 19:00:
Цитата:
Jerry писал:
Иными словами не существует декомпилятора который бы восстанавливал эту дельту и мне надо самому парсить mdl так?
Почему всем так хочется парсить smd вместо mdl?__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено KiQ 13-06-2017 в 19:29:
Дядя Миша может потому-что smd - это текстовый формат, удобный для парсинга, а mdl по сути - дамп структуры, удобный для быстрого проталкивания в оперативку?
__________________
-Brain is dead-
Отправлено nemyax 13-06-2017 в 19:46:
Цитата:
KiQ писал:
mdl по сути - дамп структуры
Ну вот, его даже парсить не надо.
Отправлено Jerry 13-06-2017 в 19:48:
Цитата:
Дядя Миша писал:
Почему всем так хочется парсить smd вместо mdl?
1.) Описание smd я знаю.
2.) Парсер уже сделал.
3.) Я не хочу завязывать игру на конкретном движке(модели из css я беру потому как точно хочу знать что такой уровень игра держит, а так модели можно и из cs1.6 взять и т.д.).
В smd можно из чего угодно портировать( я про разнообразные плагины для 3d редакторов ).
Отправлено KiQ 14-06-2017 в 13:53:
nemyax ну как бы есть языки без memcpy, например
__________________
-Brain is dead-
Отправлено Дядя Миша 14-06-2017 в 14:15:
KiQ мемкпю это часть CRT, а не языка.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено nemyax 14-06-2017 в 14:32:
KiQ
Уж структ по переменным распихать можно каким угодно языком.