Перпендикуляр от основания
| |
panorama
|
Дата: Понедельник, 21.04.2014, 19:32:31 | Сообщение # 1 |
|
Сообщений: 203
Репутация: 2 [ +/- ]
|
|
Здравствуйте ! У меня вопрос . Вот у меня есть позиция предмета (Позиция может быть хоть на потолке хоть на земле хоть на стене , мы этого не знаем) . Нужно пустить перпендикуляр от основания . Возможно ли это ?
|
|
| |
BarD
|
Дата: Вторник, 22.04.2014, 11:42:24 | Сообщение # 2 |
|
Сообщений: 943
Репутация: 137 [ +/- ]
|
|
Я думаю, возможно. Кодом помочь не смогу, извини, т.к. не умею с координатами работать. Если тебе нужно провести луч, попробуй получить координату игрока, на которой он стоит, если это игрок (GetClientAbsOrigin(client) Вроде так). Это будет наша первая точка перпендикуляра. Вторая точка будет увеличенной координатой в сторону перпендикуляра.
Например, если позиция на полу, то увеличиваем координату к потолку (Z), Если на потолке, то увеличиваем к полу (-Z).
Например, у тебя игрок стоит на полу, на координате (55.0, 60.5, 120.0). Это наша первая точка (X, Y, Z). Чтобы провести перпендикуляр, надо увеличить координату Z. Вторая точка будет с координатами (55.0, 60.5, 130.0). И от первой до второй точки проводишь луч. Это и будет перпендикуляр.
P.S. Какой командой проводится луч, не знаю, поэтому кодом не могу помочь. Удачи в обучении!
|
|
| |
ThRunningMan
|
Дата: Среда, 23.04.2014, 05:52:45 | Сообщение # 3 |
|
Сообщений: 140
Репутация: 12 [ +/- ]
|
|
BarD, увеличение Z не означает перпендикуляр, поверхность может быть слегка наклонненой или вообще под 45 градусов, и тогда будут меняться все три координаты, есть такая штука NormalizeVectror если ничгео не путаю именно он ориентарует модель в плоскости на которой он находится, конечно эта функция идет в связке с другими, просто щас времени нет расписывать, открой плагин lasermine там создается мина при наведении курсором на поверхность и от нее же идет лазер, там ест ьвычисления угла под которым смотрит игрок, вычисление точки куда он смотрит, и по этим параметрам создается вектор направления, если мы его нормализуем он станет перпендикулярным поверхности на которую смотрит игрок. P.S. Я могу и путать, т.к. пишу по памяти, но по-моему так
|
|
| |
panorama
|
Дата: Среда, 23.04.2014, 11:03:59 | Сообщение # 4 |
|
Сообщений: 203
Репутация: 2 [ +/- ]
|
|
Цитата ThRunningMan ( ) BarD, увеличение Z не означает перпендикуляр, поверхность может быть слегка наклонненой или вообще под 45 градусов, и тогда будут меняться все три координаты, есть такая штука NormalizeVectror если ничгео не путаю именно он ориентарует модель в плоскости на которой он находится, конечно эта функция идет в связке с другими, просто щас времени нет расписывать, открой плагин lasermine там создается мина при наведении курсором на поверхность и от нее же идет лазер, там ест ьвычисления угла под которым смотрит игрок, вычисление точки куда он смотрит, и по этим параметрам создается вектор направления, если мы его нормализуем он станет перпендикулярным поверхности на которую смотрит игрок. P.S. Я могу и путать, т.к. пишу по памяти, но по-моему так
Ты все верно понял ! Моя entity находиться может в любой точке , на потолке на склоне на крыше . Дело в том что в lasermine используется 2 координаты после чего смотрят между ними точку столкновения со стеной.... И от этой точки с помощью той же te_trace берут normal вектор . Код TR_TraceRayFilter(start, end, CONTENTS_SOLID, RayType_EndPoint, FilterAll, 0); // Вот Код TR_GetEndPosition(end, INVALID_HANDLE); TR_GetPlaneNormal(INVALID_HANDLE, normal); /// И вот
У меня стоит задача (Я выпускаю entity она ударяется о любой предмет (Например потолок) и от точки удара перпендикулярно идет луч) для этого мне нужно получить вектор направления ( позицию я уже получил ) .
Я склоняюсь к тому что мне придется запускать повтор. таймер и каждый раз по направлению движения получать вектор и дальше достраивать примерный путь , тут же запоминать позиции . И в конечном ударе о потолок так же пускать te_trace от последней точки сохраненной до столкновения после чего брать norrmal вектор . Но это сильно громоздкий способ и что если таких entity будет 5 или 50 будет скачек нагрузки .
Вот я и спрашиваю может кто-нибудь поможет идеями как сделать иначе ?
|
|
| |
ThRunningMan
|
Дата: Среда, 23.04.2014, 16:54:54 | Сообщение # 5 |
|
Сообщений: 140
Репутация: 12 [ +/- ]
|
|
panorama, ну лови момент прикосновения выпущенного предмета с любым другим, через Код SDKHook(entity, SDKHook_StartTouch, StartTouch); public Action:StartTouch(entity, other) { //entity тот предмет который хукаешь //other это другой объект с кем прикосается твой предмет, тут нужно ввести некоторые фильтры если нужно, например не нужно ловить момент при прикосновении игроков или каких то других предметов } получаешь координаты прикосновения и все по сути дальше тот же lasermine проводишь трасировку и нормализацию и выпускаешь луч
Сообщение отредактировал ThRunningMan - Среда, 23.04.2014, 16:57:52 |
|
| |
panorama
|
Дата: Среда, 23.04.2014, 17:08:21 | Сообщение # 6 |
|
Сообщений: 203
Репутация: 2 [ +/- ]
|
|
Цитата ThRunningMan ( ) panorama, ну лови момент прикосновения выпущенного предмета с любым другим, через Код SDKHook(entity, SDKHook_StartTouch, StartTouch); public Action:StartTouch(entity, other) { //entity тот предмет который хукаешь //other это другой объект с кем прикосается твой предмет, тут нужно ввести некоторые фильтры если нужно, например не нужно ловить момент при прикосновении игроков или каких то других предметов }
получаешь координаты прикосновения и все по сути дальше тот же lasermine проводишь трасировку и нормализацию и выпускаешь луч
Ты мой предыдущий пост не дочитал ) Я же написал я уже знаю точку соприкосновения вот как я выпущу трейс ? Код TR_GetPlaneNormal(INVALID_HANDLE, normal); Я так понимаю он же должен идти после основной функции Код TR_TraceRayFilter(start, end, CONTENTS_SOLID, RayType_EndPoint, FilterAll, 0); Или я ошибаюсь ?
|
|
| |
ThRunningMan
|
Дата: Среда, 23.04.2014, 17:19:37 | Сообщение # 7 |
|
Сообщений: 140
Репутация: 12 [ +/- ]
|
|
panorama, делай также как в лазерных минах (лазерные мины смотри которые делал FrozDark) тебе какая разница откуда координаты берутся от прицела или от столкновенияДобавлено (23.04.2014, 17:19:37) ---------------------------------------------
Код new Handle:trace = TraceRay(client); decl Float:end[3], Float:normal[3], Float:beamend[3]; if (TR_DidHit(trace) && TR_GetEntityIndex(trace) < 1) { TR_GetEndPosition(end, trace); TR_GetPlaneNormal(trace, normal); CloseHandle(trace); GetVectorAngles(normal, normal); TR_TraceRayFilter(end, normal, CONTENTS_SOLID, RayType_Infinite, FilterAll); TR_GetEndPosition(beamend, INVALID_HANDLE);
Сообщение отредактировал ThRunningMan - Среда, 23.04.2014, 17:15:59 |
|
| |
panorama
|
Дата: Среда, 23.04.2014, 18:08:46 | Сообщение # 8 |
|
Сообщений: 203
Репутация: 2 [ +/- ]
|
|
Цитата ThRunningMan ( ) panorama, делай также как в лазерных минах (лазерные мины смотри которые делал FrozDark) тебе какая разница откуда координаты берутся от прицела или от столкновения Добавлено (23.04.2014, 17:19:37) --------------------------------------------- Код new Handle:trace = TraceRay(client); decl Float:end[3], Float:normal[3], Float:beamend[3]; if (TR_DidHit(trace) && TR_GetEntityIndex(trace) < 1) { TR_GetEndPosition(end, trace); TR_GetPlaneNormal(trace, normal); CloseHandle(trace); GetVectorAngles(normal, normal); TR_TraceRayFilter(end, normal, CONTENTS_SOLID, RayType_Infinite, FilterAll); TR_GetEndPosition(beamend, INVALID_HANDLE); Сама функция Код Handle:TraceRay(client) { decl Float:startent[3], Float:angle[3], Float:end[3]; GetClientEyePosition(client, startent); GetClientEyeAngles(client, angle); GetAngleVectors(angle, end, NULL_VECTOR, NULL_VECTOR); NormalizeVector(end, end);
startent[0] = startent[0] + end[0] * 10.0; startent[1] = startent[1] + end[1] * 10.0; startent[2] = startent[2] + end[2] * 10.0;
end[0] = startent[0] + end[0] * 80.0; end[1] = startent[1] + end[1] * 80.0; end[2] = startent[2] + end[2] * 80.0; return TR_TraceRayFilterEx(startent, end, CONTENTS_SOLID, RayType_EndPoint, FilterPlayers); } Блиииииииин ну ты что вот же "end" первая позиция "startent" вторая берется от игрока angle и позиция , пускается луч , берется позиция столкновения и по тому же handle trace берется нормальный вектор в моем случае только позиция дана .
|
|
| |
ThRunningMan
|
Дата: Среда, 23.04.2014, 18:39:51 | Сообщение # 9 |
|
Сообщений: 140
Репутация: 12 [ +/- ]
|
|
panorama, ну тут надо подумать) я раньше делал что-то похожее, но и то у меня не всегда луч станвоился перпендикулярно, но в принципе такая ошибка случается очень редко, я ничего не менял также оставлял трасировку от позиции игрока, возможно это неправильно ,но это работает) может поэтому иногда не правильно становится лазер, т.е. я кидаю в стену, а он становится вдоль ее, но если так пару раз поставить то норм) Поэкспериментируй может чего и выйдет, я один раз когда для зомби мода лелал отталкивание от взрыва, всегда отталкивало в зависимости от того куда сомтрит тот кто кинул грену, но потом непонятным мне образом переставляя строки я получил нужный результат))
Сообщение отредактировал ThRunningMan - Среда, 23.04.2014, 18:41:26 |
|
| |
panorama
|
Дата: Четверг, 24.04.2014, 10:47:17 | Сообщение # 10 |
|
Сообщений: 203
Репутация: 2 [ +/- ]
|
|
Цитата ThRunningMan ( ) panorama, ну тут надо подумать) я раньше делал что-то похожее, но и то у меня не всегда луч станвоился перпендикулярно, но в принципе такая ошибка случается очень редко, я ничего не менял также оставлял трасировку от позиции игрока, возможно это неправильно ,но это работает) может поэтому иногда не правильно становится лазер, т.е. я кидаю в стену, а он становится вдоль ее, но если так пару раз поставить то норм) Поэкспериментируй может чего и выйдет, я один раз когда для зомби мода лелал отталкивание от взрыва, всегда отталкивало в зависимости от того куда сомтрит тот кто кинул грену, но потом непонятным мне образом переставляя строки я получил нужный результат)) Ладно спасибо тебе может кто еще знает )
|
|
| |
|