Решил полностью перенести поведение персонажа (скорость бега, гравитация, стрейфы и т.д) из голдсорса(а именно сделать таким же, как в кс) на другой движок для создания небольшой игры клона-убийцы контр-страйка прыгалки-скакалки. Насколько я понял, основной код лежит в папочке pm_shared, а то, что мне нужно, в файле pm_shared.c /
Тут у меня есть несколько вопросов:
1) - pm_friction - трение с землей? тоесть, сколько юнитов еще проделает мой персонаж после того, как я отпущу кнопку вперед/вбок?
2) - pm_accelerate - движение по земле? а pm_airaccelerate в функции pm_airmove - движение по воздуху?
3) - вызов функции PM_FlyMove(); в PM_AirMove - что это?
4) pm_debug.c - что и зачем это?
1) Да, если, например, оно будет маленьким, то игрок будет скользить как по льду. Это было на одной из HL Opposing Force карт.
2) Да, оно вызывается при движении по земле. И другие аналогично.
3) PM_FlyMove() это тип движения, а PM_AirMove это типо состояние, когда игрок прыгнул. Ещё PM_FlyMove() вызывается, когда игрок плавает (PM_WaterMove()).
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.
}
pmove->velocity - вектор, тоесть массив из 3х чисел - x,y,z. Но вот цифра 2 - это разве не ось Z, тогда почему гравитация действует на эту ось, а не на ось Y? Или в хлсдк вектор это (x,z,y) а не (x,y,z)?
0 - PITCH (наклон по вертикали вперёд-назад)
1 - YAW (поворот по горизонтали)
2 - ROLL (наклон по вертикали вправо-влево)
или
0 - x (вперёд)
1 - y (вправо)
2 - z (вверх)
В халфе ось Z вертикальная. ЕМНИП, термин такой фанатский есть, ни то "Мир по-Кармаку", ни то ещё "Что-то по-Кармаку". Именно из-за такой вот системы координат. Изначально были только X(вперёд) и Y(вправо). В дууме и вольфенштейне. А как дошло дело до первокваки (она трёхмерная), добавили вертикальную ось Z. Вот и весь секрет.
Я, кстати, до сих пор не обращаю на это внимания. Хотя, если вспомнить школьный курс геометрии, Кармак прав. Ведь плоскость, она горизонтальная. И двумерное пространство в халфе располагается правильно. В отличие от этих ваших 3д редакторов, где плоскость вертикальна.
Я то думаю, почему у меня персонаж ходит только влево-вправо да и прыгает как обезьяна, а тут вот оно что... А как реализована гравитация? Зависит от sv_gravity x, где х - юниты в секунду? Тоесть у меня обьект падает по такому вот закону?:
Ну неправильно же. Надо velocity.z уменьшать, чтоб падал. А по velocity.y он у тебя влево двигаться будет.
Я вообще с этим не заморачивался. Как помнил, что ось Z это перпендикуляр к плоскости, так и писал код. А за плоскость брал горизонталь, параллельную земле. Соответственно, перпендикуляр вверх смотрит. Тут и гадать-то нечего, достаточно поглядеть обнуления velocity.z в pm_shared, в условиях, когда вертикальная скорость не должна учитываться.
fire64
Да, увидел на ютубе видео с демкой на юнити, порт физики игрока с Q3 на Юнити, вроде неплохо получилось. Решил вот свой порт сделать, только с голдсорса.
Высшая математика аппрувит вертикальную ось З. Физика тоже. Кады тоже. И только автор быдлоредактора "Молочная Фигура 3Д" выпендрился и сделал У по вертикали. Возможно, школьник.
ЗЫ: А Кармаг - срамный кусок бревна, а не программер.
Цитата:
NarutoUA писал: Просто на движке unity , где я это пишу, ось Y это таки вверх