HLFX.Ru Forum
Показать все 32 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Несколько вопросов о Player Movement (pm_shared) (https://hlfx.ru/forum/showthread.php?threadid=4416)


Отправлено NarutoUA 27-05-2014 в 16:02:

Question Несколько вопросов о Player Movement (pm_shared)

Решил полностью перенести поведение персонажа (скорость бега, гравитация, стрейфы и т.д) из голдсорса(а именно сделать таким же, как в кс) на другой движок для создания небольшой игры клона-убийцы контр-страйка прыгалки-скакалки. Насколько я понял, основной код лежит в папочке pm_shared, а то, что мне нужно, в файле pm_shared.c /

Тут у меня есть несколько вопросов:
1) - pm_friction - трение с землей? тоесть, сколько юнитов еще проделает мой персонаж после того, как я отпущу кнопку вперед/вбок?
2) - pm_accelerate - движение по земле? а pm_airaccelerate в функции pm_airmove - движение по воздуху?
3) - вызов функции PM_FlyMove(); в PM_AirMove - что это?
4) pm_debug.c - что и зачем это?


Отправлено ILZM 27-05-2014 в 18:07:

1) Да, если, например, оно будет маленьким, то игрок будет скользить как по льду. Это было на одной из HL Opposing Force карт.

2) Да, оно вызывается при движении по земле. И другие аналогично.

3) PM_FlyMove() это тип движения, а PM_AirMove это типо состояние, когда игрок прыгнул. Ещё PM_FlyMove() вызывается, когда игрок плавает (PM_WaterMove()).

4) Не знаю)


Отправлено NarutoUA 27-05-2014 в 18:31:

ILZM
3) PM_AirMove, я так понял, применяется в главной функции PM_PlayerMove движение при проверке, когда тело не на земле, тоесть в воздухе, то тогда работает PM_AirAccelerate, а когда игрок на земле - PM_WalkMove и просто PM_Accelerate + PM_Friction.

Если я правильно понимаю, то этот код из PM_PlayerMove отвечает только за движения по земле, трение и движение по воздуху, и переписав это (ну и используемые функции) я получу более-менее движение как в кс/хл(без учета переменных, там ведь для каждой игры свои значения кваров), только без лестниц, воды, и хотьбы сидя:

code:
if ( pmove->onground != -1 ) { pmove->velocity[2] = 0.0; PM_Friction(); } // Make sure velocity is valid. PM_CheckVelocity(); // Are we on ground now if ( pmove->onground != -1 ) { PM_WalkMove(); } else { PM_AirMove(); // Take into account movement when in air. }


Отправлено ILZM 27-05-2014 в 18:41:

NarutoUA,да. Но не нужно забывать про просчитывание столкновений и клиентскую часть в input.cpp (может и не только).


Отправлено NarutoUA 27-05-2014 в 19:23:

В функции PM_Accelerate есть строка:

code:
accelspeed = accel * pmove->frametime * wishspeed * pmove->friction;


Меня вот интересует этот указатель pmove->friction что это?
Это указатель на эту структуру

code:
typedef struct playermove_s { ... ... float gravity; // Our current gravity and friction. float friction; ... ... }


Отправлено XaeroX 27-05-2014 в 20:18:

NarutoUA
Эта структура - параметры физики игрока, которые шарятся между сервером и клиентом в целях предиктинга.

__________________

xaerox on Vivino


Отправлено NarutoUA 28-05-2014 в 15:05:

Никак не могу разобраться в векторах.
В ф-ции PM_AddGravity () есть строка:

code:
// Add gravity incorrectly pmove->velocity[2] -= (ent_gravity * pmove->movevars->gravity * pmove->frametime );


pmove->velocity - вектор, тоесть массив из 3х чисел - x,y,z. Но вот цифра 2 - это разве не ось Z, тогда почему гравитация действует на эту ось, а не на ось Y? Или в хлсдк вектор это (x,z,y) а не (x,y,z)?


Отправлено Ku2zoff 28-05-2014 в 17:39:

0 - PITCH (наклон по вертикали вперёд-назад)
1 - YAW (поворот по горизонтали)
2 - ROLL (наклон по вертикали вправо-влево)

или

0 - x (вперёд)
1 - y (вправо)
2 - z (вверх)

В халфе ось Z вертикальная. ЕМНИП, термин такой фанатский есть, ни то "Мир по-Кармаку", ни то ещё "Что-то по-Кармаку". Именно из-за такой вот системы координат. Изначально были только X(вперёд) и Y(вправо). В дууме и вольфенштейне. А как дошло дело до первокваки (она трёхмерная), добавили вертикальную ось Z. Вот и весь секрет.
Я, кстати, до сих пор не обращаю на это внимания. Хотя, если вспомнить школьный курс геометрии, Кармак прав. Ведь плоскость, она горизонтальная. И двумерное пространство в халфе располагается правильно. В отличие от этих ваших 3д редакторов, где плоскость вертикальна.


Отправлено NarutoUA 28-05-2014 в 17:46:

Я то думаю, почему у меня персонаж ходит только влево-вправо да и прыгает как обезьяна, а тут вот оно что... А как реализована гравитация? Зависит от sv_gravity x, где х - юниты в секунду? Тоесть у меня обьект падает по такому вот закону?:

velocity.y-= sv_gravity * frametime


Отправлено Ku2zoff 28-05-2014 в 17:55:

Цитата:
NarutoUA писал:
velocity.y

Ну неправильно же. Надо velocity.z уменьшать, чтоб падал. А по velocity.y он у тебя влево двигаться будет.
Я вообще с этим не заморачивался. Как помнил, что ось Z это перпендикуляр к плоскости, так и писал код. А за плоскость брал горизонталь, параллельную земле. Соответственно, перпендикуляр вверх смотрит. Тут и гадать-то нечего, достаточно поглядеть обнуления velocity.z в pm_shared, в условиях, когда вертикальная скорость не должна учитываться.


Отправлено NarutoUA 28-05-2014 в 17:58:

Просто на движке unity , где я это пишу, ось Y это таки вверх


Отправлено fire64 28-05-2014 в 18:16:

NarutoUA, ты переносишь физику игрока из HL в Unity?

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей


Отправлено NarutoUA 28-05-2014 в 18:28:

fire64
Да, увидел на ютубе видео с демкой на юнити, порт физики игрока с Q3 на Юнити, вроде неплохо получилось. Решил вот свой порт сделать, только с голдсорса.


Отправлено ~ X ~ 28-05-2014 в 19:58:

Цитата:
Ku2zoff писал:
В халфе ось Z вертикальная.

Высшая математика аппрувит вертикальную ось З. Физика тоже. Кады тоже. И только автор быдлоредактора "Молочная Фигура 3Д" выпендрился и сделал У по вертикали. Возможно, школьник.
ЗЫ: А Кармаг - срамный кусок бревна, а не программер.

Цитата:
NarutoUA писал:
Просто на движке unity , где я это пишу, ось Y это таки вверх

Так, значит, не зря его здесь так нелюбят?

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено XaeroX 28-05-2014 в 20:00:

Цитата:
~ X ~ писал:
И только автор быдлоредактора "Молочная Фигура 3Д" выпендрился и сделал У по вертикали. Возможно, школьник.

Ну ты же в курсе, что по умолчанию и в д3д, и в опенгл вертикальная ось - У? Ты же в курсе, да?..

__________________

xaerox on Vivino


Отправлено Government-Man 29-05-2014 в 19:01:

Цитата:
XaeroX писал:
Ну ты же в курсе, что по умолчанию и в д3д, и в опенгл вертикальная ось - У?


Так то пространство камеры, связанной с экраном, там плоскость - считай экран. Но при моделировании имхо гораздо удобнее, когда плоскость горизонтальна. Дело привычки конечно, но когда я вижу движок, в котором ось Y направлена вверх, у меня сразу наступает глубокий фейспалм. Матрицы для перевода из одной системы координат в другую строятся достаточно элементарно, так в чем проблема?


Отправлено XaeroX 29-05-2014 в 19:11:

Цитата:
Government-Man писал:
так в чем проблема?

В том, что Современный Погромизт старается быстрее начать прикручивать ГРАФОН, и ему некогда разбираться с осями.

__________________

xaerox on Vivino


Отправлено NarutoUA 01-06-2014 в 15:56:

Почему игрок двигается со скоростью 250 юнитов в секунду? Там ведь идет ускорение игрока в упор до определенной скорости (вроде до sv_maxspeed 320). Но почему-то на самом деле скорость 250, а не 320.


Отправлено XaeroX 01-06-2014 в 16:15:

Ну так трение же.

__________________

xaerox on Vivino


Отправлено NarutoUA 26-06-2014 в 17:46:

Подниму относительно старую тему, но у меня опять есть парочка вопросов.
1) Что делает функция PM_PlayerTrace? Вот пример:

trace = pmove->M_PlayerTrace (pmove->origin, end, PM_NORMAL, -1 );

2) Функция PM_ClipVelocity, которая вызывается из другой функции - PM_FlyMove нужна чтобы регулировать скорость игрока когда он двигается по диагонали к стене?


Отправлено NarutoUA 02-07-2014 в 21:29:

Hey, anybody tut?


Отправлено ~ X ~ 03-07-2014 в 07:26:

Привет, натуро.
Не отвечает никто потому что есть море способов это узнать:
0) посмотреть, где, кто и зачем её использует
1) интернеты
2) исходники ксаша
3) а ты сразу сюда - форум

ЗЫ: я наизусть эти функции не помню, так что, могу только предполагать. Но предполагать каждый может, так что, это не надёжно.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]


Отправлено Ghoul [BB] 10-07-2014 в 08:36:

~X~, MOTD: интернеты кончились, ухожу в реал.

Вау! У тебя появилась девушка???

__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.

Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo


Отправлено Cybermax 10-07-2014 в 11:26:

Появление девушки у кого то на этом форуме вызывает удивление))

__________________


Отправлено Ghoul [BB] 12-07-2014 в 18:02:

Да, именно так

Ну и обычно (исходя из собственного опыта общения с людьми), такие пафосные фразы выскакивают чуть реже, чем всегда, именно при появлении очередной подруги....

__________________
Ты топчешь мир своими ботинками,
Не замечая куда наступаешь,
А время от тебя уходит цветными картинками,
Но ты даже этого не понимаешь.

Компрометирую данные своей учётной записи.
ЛОГИН: Ghoul [BB]
ПАРОЛЬ: paladin_solo


Отправлено FaL_DissecTor 06-11-2014 в 12:52:

О, я тогда и свой вопрос задам.
Делал для Кибермакса кое какую, корявую заморочку по распрыжке, скопипастил с ку3 код и подправил на свое усмотрение. Врезаться в лесенки игрок почти перестал (то есть при высоте stepsize и ударе в вертикальную плоскость он "зашагивает" на неё), но появился косяк небольшой. Игрок движется в направлении взгляда, то есть если прицел опустить в пол и бежать вперед, он будет как баран рогом упираться в землю и стоять на месте. Подскажет кто нибудь, как при этом движение вперед а не в землю осуществляется?

А то Кибермакс я гляжу исходники потерял и ему горестно, а они у меня есть, но нужно подправить. Поможем члену партии. =)

__________________
Такие дела...


Отправлено XaeroX 06-11-2014 в 13:23:

FaL_DissecTor
Надо питч у вьюанглес клампить не по (-90, 90), а по (-89.9,89.9).
Тогда полученный из них v_forward можно будет спроектировать на плоскость гравитации (тупо занулив z), нормализовать и получить v_forward для движения вперёд.

__________________

xaerox on Vivino


Отправлено FaL_DissecTor 06-11-2014 в 13:26:

Ммм, я кажется понимаю где собака зарыта, я похоже бездумно все обнуления z потер (дабл джамп), спасибо за объяснение.

__________________
Такие дела...


Отправлено JPEG 08-08-2023 в 19:42:

Поднимаю старую тему.

При нажатии вперёд игрок движется со скоростью 320 ups (maxspeed 320 ограничивает forwardspeed 400)

При нажатии шифта: forwardspeed 400 * мувспидкий = 120 юнитов в сек.

При нажатии контрола: maxspeed 320 * 0.333 = 106.5 ups

Почему при нажатии контрола и шифта скорость ~10.5 юнитов в секунду?

__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))

перехожу на другой двиг


Отправлено Ku2zoff 14-08-2023 в 12:17:

Цитата:
JPEG писал:
Почему при нажатии контрола и шифта скорость ~10.5 юнитов в секунду?

sv_friction покрути. Очень сильно снижает значение, когда скорость ниже определённого порога. То же самое с sv_edgefriction. А так по идее да, должна быть 0.3 от скорости в приседе, примерно 30 юнитов.


Отправлено JPEG 15-08-2023 в 22:08:

Цитата:
Ku2zoff писал:
sv_friction покрути. Очень сильно снижает значение, когда скорость ниже определённого порога. То же самое с sv_edgefriction. А так по идее да, должна быть 0.3 от скорости в приседе, примерно 30 юнитов.


там как-то коряво сделано, movespeedkey расчитывается не от фактической скорости игрока (320), а от заданной в forwardspeed (400). Т.е. по-идее должно получиться 40 юнитов в секунду (скорость при беге 400*0.3 умножается на 0.333). Но что замедляет бег в присяде не нашёл

__________________
МОЙ НОВЫЙ ПАБЛИК ПО ХЛ))

перехожу на другой двиг


Отправлено Ku2zoff 16-08-2023 в 12:44:

Цитата:
JPEG писал:
Но что замедляет бег в присяде не нашёл

PM_Accelerate погляди. Я уже забыл, как оно всё работает, полгода не кодил, но вроде бы оно.


Временная зона GMT. Текущее время 00:08.
Показать все 32 сообщений этой темы на одной странице

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