Всем доброго дня. У меня возникла такая проблема - я не могу сообразить как узнать координаты кости 3D модели. То что сам SourcePawn видит эти кости (и аттачи) сомнений нет. Проверенно при паренте. А вот как узнать их координаты? Может быть можно как то именно через парент это сделать? Если есть те кто такую практику имел, напишите пожалуйста. Мне не нужен сам код - нужна логика - как это сделать. Хотя и от кода не откажусь.
Как вариант: Создаешь какое-нибудь ентити, привязываешь к своему аттачу, получаешь ее координату.
:klas: Прикольная мысль. Я бы в жизнь не догадался. Припарентить. Сделать прозрачной. И оставить.
GetEntPropVector(невидимый_парент, Prop_Send, "m_vecOrigin", Pos); Получится тогда при движении кости будет двигаться и невидимый парент, и уже координаты парента будут координатами кости. Я твою мысль правильно понял? Выходные будут - обязательно попробую. На свежую голову.
Добавлено (23.04.2016, 19:39:58) --------------------------------------------- Попробовал. Результат такой.
Если использую m_vecAbsOrigin определяет координаты более-менее. При использовании m_vecOrigin координаты не определяет вообще ( 0 0 0 ) Все по нулям.
m_vecAbsOrigin - это как бы кешированные координаты. m_vecOrigin - это уже текущие координаты.
В чем может быть причина?
Добавлено (23.04.2016, 19:58:01) --------------------------------------------- Пробовал создавать динамиком и физиком. Всё так же остается. Если получать данные так GetEntPropVector(невидимый_парент, Prop_Send, "m_vecOrigin", Pos); то спустя какое то время появляется ошибка. Меняю Prop_Send на Prop_Data все становится нормально.
Для информации - сам проверил: Prop_Send для "m_vecOrigin" Prop_Data для "m_vecAbsOrigin"
Подозреваю что m_vecOrigin не работает на движущихся объектах. Видимо нужно самому попробовать отслеживать изменение координат, может быть в цикле или еще как то. Не могу просто представить как это сделать на анимированой 3D модели. Припарентеная модель держится отлично.
Может быть есть еще какие нибудь варианты получения координат самой кости?
Сообщение отредактировал tonline_kms65 - Воскресенье, 24.04.2016, 09:02:00
Модель двигается - а координата стоит на месте. На каждую анимацию своё положение. Но во время анимации движения нет. Я уточню - нет движения. Сама мриатаченная энтитя двигается с костью как будто там и была.
Добавлено (24.04.2016, 15:23:09) --------------------------------------------- Кстати интересно - если попробовать полуцчить координаты летящей гранаты, получится или нет.
Сообщение отредактировал tonline_kms65 - Понедельник, 25.04.2016, 23:09:37
Кстати интересно - если попробовать полуцчить координаты летящей гранаты, получится или нет.
Должно.
Цитатаtonline_kms65 ()
Модель двигается - а координата стоит на месте.
Странно. По идее, если проп привязывается к кости, то он должен двигаться вместе с самой костью во время анимации. Следовательно, и координата должна меняться.
Может быть при создании энтитьки я что то не так делаю.
DispatchSpawn(ent) При задании этой команды (на паренте), модель пропадает (я пока не знаю где она появляется и появляется вообще). Если задаю команду TeleportEntity(ent, pos, angle, NULL_VECTOR) без DispatchSpawn(ent), модель (парент) держится как влитая, там куда я её прилепил. При любой анимации. Может быть именно при объявлении команды DispatchSpawn(ent) (рождении энтитьки) объявляются и все её свойства в том числе и координаты.
А так как я создаю энтитю и просто телепортирую её в точку привязки (без DispatchSpawn(ent))возможно что и свойства энтитя не получает. Просто появляется как картинка. У меня просто времени мало, пока не могу проверить. На выходных займусь. Я поэтому и спросил про гранату. Что бы не изобретать велосипедов.
new ent_rocket_attach = CreateEntityByName("prop_dynamic_override"); if(ent_rocket_attach != -1){ if (!IsModelPrecached(ROCKET_ATTACH_POSITION)){ PrecacheModel(ROCKET_ATTACH_POSITION, true); } SetEntityModel(ent_rocket_attach, ROCKET_ATTACH_POSITION); //DispatchSpawn(ent_rocket_attach); SetEntPropEnt(ent_rocket_attach, Prop_Send, "m_hOwnerEntity", client); DispatchKeyValue(ent_rocket_attach,"classname", "attach_laser"); DispatchKeyValue(ent_rocket_attach, "solid", "6"); физбокс на всякий случай, вдруг без него и свойств нет. Хотя навряд ли. TeleportEntity(ent_rocket_attach, pos, angle, NULL_VECTOR);
Добавлено (25.04.2016, 23:45:48) --------------------------------------------- А нет. Прошу прощения. DispatchSpawn(ent_rocket_attach) включено. Это просто старый код был. Так что вопрос пока повис. Дело не в создании энтити. На скрине видно что начало лазера чуть чуть в стороне от центра. Анимация уже началась и модель немного сместилась. Но это начало анимации. Т.е. эта точка так на этом месте и останется до следующей анимации.
Странно. По идее, если проп привязывается к кости, то он должен двигаться вместе с самой костью во время анимации. Следовательно, и координата должна меняться.
Вот как-раз сам проп держится там где нужно как приклеенный. Проблема именно с перехватом его координат, и именно в движении..
Гости не могут скачивать файлы
Сообщение отредактировал tonline_kms65 - Вторник, 26.04.2016, 06:55:59
Я о чем и толкую. Конечно нет. При начальном движении анимации координаты видимо захватывает и оттуда начинается луч, при следующей анимации также начальные координаты захватывает. Но во время движения самого пропа (от первого фпейма до последнего ) его координаты где то теряются. Видимо во время движения сами функции отключены для уменьшения нагрузки на процессор. Есть только начальные и конечные координаты. (Это моё предположение) Я поэтому про перехват координат гранаты спрашивал.
Сообщение отредактировал tonline_kms65 - Вторник, 26.04.2016, 16:51:44
Как ты создаешь лазер? И как часто ты его создаешь?
Создаю самым простым способом TE_SetupBeamPoints(ПроgсOrigin, EnemyPos, g_LightningSprite, ........ через таймер, примерно 2 раза в секунду, если есть противник естественно. Даже нет. Не через таймер. Таймером задаю задержку, так вернее.
1. Я уже думал создать не временную энтитьку. На выходных попробую. Её можно просто приаттачить к кости. 2. Попробую ловить координаты в цикле или OnGameFrame() (это то-же самое что void Update() по моему).
Добавлено (30.04.2016, 18:15:34) --------------------------------------------- Я сразу не сообразил - даже если я энтитьку приаттачу - толку-то. Там нужны так же начальные координаты.
new ent = CreateEntityByName("env_beam"); if (ent != -1) { TeleportEntity(ent, start, NULL_VECTOR, NULL_VECTOR); SetEntityModel(ent, g_colorchosen); // This is where you would put the texture, ie "sprites/laser.vmt" or whatever. SetEntPropVector(ent, Prop_Data, "m_vecEndPos", end); DispatchKeyValue(ent, "targetname", "beam"); DispatchKeyValue(ent, "rendercolor", "255 255 255"); DispatchKeyValue(ent, "renderamt", "100"); DispatchSpawn(ent); SetEntPropFloat(ent, Prop_Data, "m_fWidth", float(g_lasersize)); // how big the beam will be, i.e "4.0" SetEntPropFloat(ent, Prop_Data, "m_fEndWidth", float(g_lasersize)); // same as above ActivateEntity(ent); AcceptEntityInput(ent, "TurnOn"); }
Пробовал сегодня в цикле отловить координаты. Сама модель (родитель) координаты отлавливаются отлично m_vecOrigin. А вот с аттачем проблемы. m_vecOrigin стоят координаты по нулям. Если отлавливать с помощью m_vecAbcOrigin вроде неплохо отлавливается, но идет задержка. Во головняк так головняк. Нужно смотреть сами функции. Как они работают.
Сообщение отредактировал tonline_kms65 - Суббота, 30.04.2016, 18:21:30
Добавлено (04.05.2016, 21:39:56) --------------------------------------------- Суть в том, что при ClearParent, ентити возвращается на место, где была во время инпута.
Сообщение отредактировал inklesspen - Пятница, 06.05.2016, 17:25:35