Как в 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 ( nodeIndex < 0 ) {
if ( map.bsp.leafs[ ~nodeIndex ].contents !== CONTENTS_SOLID ) {}
}
вместо
C++ Source Code:
if ( nodeIndex < 0 ) {
if ( nodeIndex !== CONTENTS_SOLID ) {}
}
В остальном же все также как и в PM_RecursiveHullCheck
Jerry писал: Как в hl1 происходит наложение декалей?
Находится поверхность, создаётся полигон, размерами с декаль, потом обрезается плоскостями, чтобы куски декали не висели в воздухе. Кол-во полигонов при этом увеличивается. Поэтому лимит в 4096 декалей - он для всех фрагментов, а не для каждой отдельной. Впрочем мелкие декали обычно занимают один фрагмент. Нужная поверхность находится рекурсивным поиском по бинарному дереву. Но я почти уверен, что ты хотел узнать что-то другое.
Цитата:
Jerry писал: Также как работает анимация в hl2.
Да точно так же как и в hl2 + свежие навороты, типа инверсной кинематики, дельты.
Цитата:
Jerry писал: Вся проблема( на данный момент ) в delta(subtract).
Это нерешаемая проблема на уровне декомпиляции. Дельта - это когда из какой-то анимации вычли базовую. Упоминание о базовой анимации в модель не попадает. То есть в готовой модели у нас есть дельта-анимация, из которой вычли какую-то. Какая это анимация - никто не знает. Ну можно предположить, что idle, но это далеко не всегда верно. Может и BindPose. Чтобы лучше понять суть - допустим у нас есть число 42, которое получено в результате вычитания одного числа из другого.
Но мы никак не сможем узнать каким было второе число, поскольку не знаем и первого. Уравнение с двумя неизвестными имеют бесконечное множество решений, которые с точки зрения математики будут верными.
Цитата:
Jerry писал: И как декомпилировать?
ДА НЕ КАК
Добавлено 10-06-2017 в 19:06:
Цитата:
Jerry писал: Нужно было перебирать nodes а не clipnodes.
Nodes это точечный хулл, он копируется в clipnodes[0].
Дядя Миша писал: Это нерешаемая проблема на уровне декомпиляции. Дельта - это когда из какой-то анимации вычли базовую. Упоминание о базовой анимации в модель не попадает. То есть в готовой модели у нас есть дельта-анимация, из которой вычли какую-то. Какая это анимация - никто не знает. Ну можно предположить, что 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 )) воспроизводятся нормально
Опять вы меня не поняли.
Я пишу свой вьювер(куда там delta'у ставить? )
Мне нужно узнать алгоритм смешивания этой (вычтенной , или из нее надо вычесть текущую и т.д. ) анимации с другими.
Т.к. даже просто анимация без смешивания не соответствует анимации в hlmv я и думаю что дело в substrac( что декомпиляторы не всю информацию достают , или формат информации таков, что не может быть сохранен в smd(даже с модификациями из qc(вроде weightlist ) ) ).
Jerry писал: Я пишу свой вьювер(куда там delta'у ставить?
Эпидемия прямо на вьюверы. Я вот тоже свой написал. И разработал новый формат моделей, совместимый с голдсорсом, смотреть тут. Так что по счастливому стечению обстоятельств, я про эту дельту как раз таки в курсе.
Цитата:
Jerry писал: Мне нужно узнать алгоритм смешивания этой (вычтенной , или из нее надо вычесть текущую и т.д. ) анимации с другими.
в hl2_sdk есть файлег public\bone_setup.cpp и там наглядно, как смешивать дельта-анимации с обычными. Гуглить по слову STUDIO_DELTA и STUDIO_ANIM_DELTA. Если в крации - обычная анимация полностью оверрайдит дефолтные значения костей, а дельта прибавляется к ним.
Но тут еще один ньюанс - ни кровбар ни кэннонфодер нормально эту дельту не извлекают из модельки. То есть декомпил-компил портит модель однозначно.
Дядя Миша писал: в hl2_sdk есть файлег public\bone_setup.cpp и там наглядно, как смешивать дельта-анимации с обычными. Гуглить по слову STUDIO_DELTA и STUDIO_ANIM_DELTA. Если в крации - обычная анимация полностью оверрайдит дефолтные значения костей, а дельта прибавляется к ним.
Спасибо(пойду читать, думаю то что надо).
Цитата:
Дядя Миша писал: Но тут еще один ньюанс - ни кровбар ни кэннонфодер нормально эту дельту не извлекают из модельки. То есть декомпил-компил портит модель однозначно.
Иными словами не существует декомпилятора который бы восстанавливал эту дельту и мне надо самому парсить mdl так?
Добавлено 13-06-2017 в 21:32:
Цитата:
Дядя Миша писал: Эпидемия прямо на вьюверы. Я вот тоже свой написал. И разработал новый формат моделей, совместимый с голдсорсом, смотреть тут. Так что по счастливому стечению обстоятельств, я про эту дельту как раз таки в курсе.
Я пишу мини игру(типа cs, думаю взять карту из cs1.6, а модели игроков/оружия из cs:s) для браузера.
Дядя Миша может потому-что smd - это текстовый формат, удобный для парсинга, а mdl по сути - дамп структуры, удобный для быстрого проталкивания в оперативку?
Дядя Миша писал: Почему всем так хочется парсить smd вместо mdl?
1.) Описание smd я знаю.
2.) Парсер уже сделал.
3.) Я не хочу завязывать игру на конкретном движке(модели из css я беру потому как точно хочу знать что такой уровень игра держит, а так модели можно и из cs1.6 взять и т.д.).
В smd можно из чего угодно портировать( я про разнообразные плагины для 3d редакторов ).