HLFX.Ru Forum Страницы (2): [1] 2 »
Показать все 19 сообщений этой темы на одной странице

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:

Half-Life Декали и анимация

Как в hl1 происходит наложение декалей?
прошу объяснить просто алгоритм (как трассировать пулю, и найти поверхность на которую надо наложить( в контексте не измененной структуры bsp файла).
Я смотрел исходники xash но толком не чего не понял.

Также интересует как работает анимация в hl2.
К примеру я хочу взять анимацию одного из игроков cs:s, с геометрией проблем нет, а вот вся(наверное вся. мне бы хоть ее вытащить) анимация лежит в файле cs_player_shared.

Так вот. Как я понял анимацию там надо смешивать.
К примеру:


  1. walk_lower(из 9 разных анимаций выбираются четыре, они смешиваются)
  2. Walk_BodyOffset_FAMAS
  3. Walk_Aim_FAMAS
  4. 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


Отправлено Дядя Миша 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
Уж структ по переменным распихать можно каким угодно языком.


Временная зона GMT. Текущее время 19:10. Страницы (2): [1] 2 »
Показать все 19 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024