Здравствуйте, уважаемые форумчане! Достаточно много читал ваш форум, многому научился, но не могу разобраться с одним вопросом - как привязать к камеру к аттачменту на модели? Написал свой env_model и триггер, который при активации делает SET_VIEW() на эту модель. Модель анимированая, (в качестве примера взял руки при поднимании по лестнице из cof). У неё есть аттачменты, которые при просмотре в model viewer качаются из стороны в сторону. Собственно, вопрос. Как я понял, SET_VIEW ставит камеру куда-то в середину оной, и это ещё пол беды - она (функция) относится к движковым, насколько понимаю, и влезть в её код с целью изменить что-то нет никакой возможности ( не нашёл даже сообщения, которое сервер передаёт клиенту при вызове ). В StudioModelRenderer смотрел, но и там мало что понял. Не прошу тупо кода, а просто подтолкните меня в нужном направлении, как это сделать. В какие строчки смотреть, ну или хотя бы общую теорию объясните (может быть вообще не в ту сторону копаю, так же интересен сам механизм работы SET_VIEW, потому что вменяемой информации я нигде не нашёл, кроме камеры CTriggerCamera в оригинале, но камера аттачменты никак не учитывает). Буду благодарен.
з.ы. использую sdk 2.3 без спирита
domded писал: Как я понял, SET_VIEW ставит камеру куда-то в середину оной
Просто в оригин модели.
Цитата:
domded писал: не нашёл даже сообщения, которое сервер передаёт клиенту при вызове
svc_setview
очень простая функция, сообщает клиенту от позиции какой энтити рисовать вид. В view.cpp представлен весь код камеры, который нужен.
Вот это вот в функции V_CalcNormalRefdef
C++ Source Code:
1
// override all previous settings if the viewent isn't the client
вот оно копирует у вью-энтити оригин и углы. Берем из аттачмента новый оригин и норм. А углы можно рассчитать, как я уже объяснял в своём легендарном туториале.
Цитата:
ILZM писал: И еще в Xashe есть привязка к аттачменту.
Там хитрее. Привязка произвольной энтити к аттачменту через парент-систему. Поэтому в явном виде этот код скопировать не получится.
Примерно понял, о чём вы. Только не получается. Код StudioCalcAttachments взял из вашего тутора "получение углов аттачмента на клиенте". Привожу изменённый код указанного вами фрагмента в view.cpp ( такое ощущение, что изменённый код вообще не видит массива аттачментов, либо во всём массиве pattachments почему-то стоит позиция нулевого - в этой модели она там в центре у самой земли).
(пробовал ставить в pattachmebt[ ] любое значение, эффекта нет). Так же я не совсем понял, куда сохранять рассчитанные углы из CalcAttachments, вижу только вариант с изменением mstudioattachment_t. Но при любом добавлении полей в эту структуру игра ( закономерно, наверняка ) валится, так как это движковый тип.
Раз уж нельзя редактировать тему, то спрошу ещё одним постом. С координатами аттачмента я разобрался, но они не меняются. то есть каждый фрейм анимации этих самых рук я получаю координаты те, которые есть в стоячей модели (при этой самой анимации руки движутся вверх, позиция енв_модел в мире не меняется). Следовательно, как можно прибавить к координатам аттачмента текущую позицию анимации?
Апд. Попробовал по похожей схеме получить кости, чтобы узнать их координаты и прибавить к координатам аттачмента. Но в mstudiobone_t нет координат. Откуда их можно вытащить?
вот так я бы делать зарёкся. Это в чистом Си такое прокатывает, а С++ полезет совсем не туда. Я и сам себя неоднократно ловил на этом.
Пишешь по привычке, по Сишному, хренак - вылет.
attachmentindex это смещение от начала буффера, по котрому мы попадём на структуру аттачментов.
Да ты собсно, ерундой занимаешься. org аттачмента локальный и имеет какие-нибудь смешные значения, типа 0.1 5.3 -2.0
прибавляя к нему оригин ты сдвинешь камеру настолько незначительно, что даже незаметишь этого.
Более того - всё это совершенно ненужно. Вот так делай:
domded писал: Так же я не совсем понял, куда сохранять рассчитанные углы из CalcAttachments, вижу только вариант с изменением mstudioattachment_t.
Гы. Ну можешь в position_history_t писать. Она вроде только игроком используется, а в остальных энтитях болтается незанятой. Там как раз оригин и углы. 64 позиции = 64 аттачмента
Цитата:
domded писал: куда сохранять рассчитанные углы из CalcAttachments, вижу только вариант с изменением mstudioattachment_t.
Ну ты отдаешь себе отчёт, что запишешь трансформированный аттачмент в саму модель, копий которых в мире может быть сколько угодно? Это вьюмодель одна на всю игру.
Странно. Проверил всё выводом в консоль. У всех аттачментов почему-то одинаковые позиции (viewentity->attachments[i], i - с 0 до 3), и с вашим кодом рассчёта, и с оригинальным вальвовским. Из-за чего такое может быть? Прикладываю модель в архиве.
Вложение: ladder_climb.zip (475.3 кб)
Этот файл был скачан 221 раз.
Да нормальная моделька, вполне.
К слову сказать, там вот эти два аттачмента для взгляда - они как раз из-за того, что кофовцы мой тутор не читали. И тянут вектор от одного аттачмента к другому, чтобы получить углы.
Это понятно. Но почему тогда у разных аттачментов в массиве viewentity->attachments одинаковая позиция? Код вывода позиций привожу, во вьюэнитити моделька точно та, которая и должна быть:
А какая разница? Они же не обнуляются с прошлого кадра.
Для вьюмодели (оружие в руках), аттачменты считаются ПЕРЕД началом кадра. Сделано это по одной-единственной причине - чтобы маззлфлэшы не отставали от оружия при выстрелах.
Я не так глубоко понимаю код рендера моделей халфы, чтобы понять, как всё это устроено.
Кстати, обнаружил ещё одну весьма странную вещь: если получать оригин аттачмента через mstudioattachment_t, то аттачи получаются такими, какими они и должны быть: нормальными и встающими туда куда надо (конечно, нужно прибавить глобальный оригин самой энтити). если же получать их через viewentity->attachment[index], то во всех индексах помещён xyz центра модели на нижней её грани - мировые координаты (глюк?).
Апд, через час:
Так же порылся в коде рендера и вообще ничего в этой жизни не понимаю: в коде studiodrawmodel условие if ( flags & STUDIO_EVENTS) . Моя моделька туда попадает. В блоке этом вызывается рассчёт атттачей ( StudioCalcAttachments() ) с учётом текущей позиции костей. Это есть. А потом начинается что-то невероятное: копирование памяти в указатель на аттачменты (ent->attachment,m_pCurrentEntity). Индекс у модели соответствует индексу моей модели с руками. Но в модели с руками ( из view.cpp, причём в m_pCurrentEntity из cstudiomodelrenderer координаты аттачей двигаются как положено, я проверил это консолью) всё равно остаются какие-то непонятные числа. Как это понимать? Я действительно не могу сам разобраться, уже всю голову себе сломал. Вроде бы там идёт прямой memcpy. В чём ошибка? Остальной код CalcNormalRefDef, кроме этого куска, я вообще не трогал. Но нашёл воркэраунд, так сказать. В gHUD передаю специальное сообщение ( с указанием индекса энтити, которую камера должна сейчас отследить ), запоминаю индекс энтити и создаю массив из трёх векторов. В студиодравмодель после вызова калькуляции аттачментов запихиваю мемсру m_pCurrentEntity->attachment в мою переменную с векторами в gHUD, потом использую её (мою переменную из гхуда) в CalcNormalRefDef. Тогда камера двигается нормально, как ей и положено. Что это за глюк такой-то, а?
Да ерундой маешься. Прекрасно там всё воркает. Ты по сути нагромоздил лишнего и теперь пытаешься заставить его работать. А оно не нужно по сути.
Я тебе дал код - он должен работать. Если нет - смотри где косяк на сервере.
Да, всё понял. Действительно у меня какие-то глюки могут быть, поскольку у меня в длл очень много изменений. Буду проверять на чистом. Спасибо вам большое.