![]() |
Реализация игрока в FPS
Главный персонаж в FPS должен бегать, прыгать, приседать. Я реализовывал его следующим образом:
Пивот у пола (Pvt1) связанный с ним пивот в районе головы (Pvt2) и камера в районе головы: Global Pvt1 = CreatePivot() Global Pvt2 = CreatePivot(Pvt1) Global Cam = CreateCamera(Pvt2) PositionEntity Pvt1 0, 50, 0 PositionEntity Pvt2, 0, 70, 0 PositionEntity Cam, 0, 50, 0 Для перемещении игрока двигаю Pvt1 Для вращения головы вращаю камеру Для определения возможности прыжка проверяю наличие колиизии Pvt1 с комнатой При приседании опускаю Pvt2 При возникновении коллизии Pvt2 с комнатой (чтобы башка не съезжала при ударении в косяк например) перемещаю Pvt1 след. образом: EntityParent Pvt2, 0 PositionEntity Pvt1, EntityX(Pvt2, True), EntityY(Pvt1, True), EntityZ(Pvt2, True), TrueEntity Parent Pvt2, Pvt1 Наблюдается следующий артефакт - когда стоишь рядом со стеной то прыгать можно постоянно, т.к. имеется коллизия Pvt1 со стеной (которая также как и пол является частью комнаты) Для устранения добавлял еще один пивот у пола Pvt3 - меньшего радиуса и для определения возможности прыжка проверяю наличие колиизии Pvt3 с комнатой. Из-за меньшего радиуса он соприкасается только с полом а не со стеной. В целом такая реализация срабатывает, но иногда наблюдается косяки. ИМХО все как то усложнено.Полагаю что я во многом перемудрил, вот и хотел узнать как подобное реализуют другие. |
Re: Реализация игрока в FPS
мм а если это фпс зачем так мудрить просто камеру опускаешь при приседание, поднимаеш при прыжке
а игрок бокс или сфера за камерой но ето мое мнение я так и делаю |
Re: Реализация игрока в FPS
"опускаешь при приседание"
При приседании надо еще уменьшать высоту коллизии. "поднимаеш при прыжке" А как он перепрыгивать препятствие будет если только камеру поднимать "а игрок бокс или сфера за камерой" Все равно для просчета коллизий игрок будет сферой, но опять же как определять момент когда он может прыгнуть. К тому же если делать для коллизии высоту равную высоте игрока, то тогда этот игрок будет пешком на столы взбираться, потому что радиус большой получится |
Re: Реализация игрока в FPS
Ничего подобного, если ты делаеш фпс, тебе нужин игрок высотой-4, и ты делаеш EntityRadius Игрок,4 то у тебя получается большая сфера:)
Тебе поможет такой вариант EntityRadius Игрок,1,4 ;) PS/ что именно в крации тебе непонятно(аспекты) |
Re: Реализация игрока в FPS
Цитата:
Цитата:
|
Re: Реализация игрока в FPS
Я реализовал физ поведение перса как в HL2, там у меня меэшь, с коллизией элипсоидной ( EntityRadius Mesh,.5,1.7 ). 2 пивота, у ног и чуть ниже самого верха элипсоида, припивочены к Мэшу. И ещё 2 пивота, при коллизии вычесляется самая нижняя точка коллизии и ставится 1 из пивотов туда, и так-же со вторым пивотом, затем проверка на дистанцию, если у ног приколлизии дистанция меньше .3, то перс стои, ежели не так, то другие варрианты. Насчёт головы, это если перс ударяется. Мэшь двигается исключительно по Yaw, а камера припивочена к верхнему пивоту и протиться вместе с ним, только ещё и по Pitch от мышки. Далее при примедании изменяется радиус элипсоида, и двигаются 2 пивота ног и головы, и при вставании обратно. Коллизия от патронов и всякого, осуществляется на Мэшь (Модель перса, которая тоже анимируется), это для реалистичности, притом при приседании, всё будет просто - анимация.
|
Re: Реализация игрока в FPS
=-O.
clmap=0 for i=1 to countcollisions(player) if map=collisionentity(player,i) then clmap=i next if clmap<>0 then ................................. CollisionY(player,clmap)-EntityY(player,1) - угадайте что. |
Re: Реализация игрока в FPS
Коллизий может быть в один моммент не 1. Тут нужно вычеслить самую низкую и самую высшую.
|
Часовой пояс GMT +4, время: 19:00. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot