forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Реализация игрока в FPS (http://forum.boolean.name/showthread.php?t=2868)

X-Ranger 05.03.2007 14:56

Реализация игрока в 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 с комнатой.

Из-за меньшего радиуса он соприкасается только с полом а не со стеной.

В целом такая реализация срабатывает, но иногда наблюдается косяки. ИМХО все как то усложнено.Полагаю что я во многом перемудрил, вот и хотел узнать как подобное реализуют другие.

Horror 05.03.2007 15:33

Re: Реализация игрока в FPS
 
мм а если это фпс зачем так мудрить просто камеру опускаешь при приседание, поднимаеш при прыжке
а игрок бокс или сфера за камерой
но ето мое мнение я так и делаю

X-Ranger 05.03.2007 16:08

Re: Реализация игрока в FPS
 
"опускаешь при приседание"

При приседании надо еще уменьшать высоту коллизии.


"поднимаеш при прыжке"

А как он перепрыгивать препятствие будет если только камеру поднимать

"а игрок бокс или сфера за камерой"

Все равно для просчета коллизий игрок будет сферой, но опять же как определять момент когда он может прыгнуть. К тому же если делать для коллизии высоту равную высоте игрока, то тогда этот игрок будет пешком на столы взбираться, потому что радиус большой получится

ЛысыЙ_Чук-Иванчук 05.03.2007 17:28

Re: Реализация игрока в FPS
 
Ничего подобного, если ты делаеш фпс, тебе нужин игрок высотой-4, и ты делаеш EntityRadius Игрок,4 то у тебя получается большая сфера:)
Тебе поможет такой вариант EntityRadius Игрок,1,4 ;)
PS/ что именно в крации тебе непонятно(аспекты)

X-Ranger 05.03.2007 22:07

Re: Реализация игрока в FPS
 
Цитата:

Сообщение от vlad
Ничего подобного, если ты делаеш фпс, тебе нужин игрок высотой-4, и ты делаеш EntityRadius Игрок,4 то у тебя получается большая сфера:)
Тебе поможет такой вариант EntityRadius Игрок,1,4 ;)

Хочешь сказать эллипс а не сфера.

Цитата:

Сообщение от vlad
PS/ что именно в крации тебе непонятно(аспекты)

Например как при такой реализации (камера и 1 пивот) определить момент когда игрок может прыгать, а когда нет, учитывая что пол и стены принадлежат одному объекту?

moka 05.03.2007 22:36

Re: Реализация игрока в FPS
 
Я реализовал физ поведение перса как в HL2, там у меня меэшь, с коллизией элипсоидной ( EntityRadius Mesh,.5,1.7 ). 2 пивота, у ног и чуть ниже самого верха элипсоида, припивочены к Мэшу. И ещё 2 пивота, при коллизии вычесляется самая нижняя точка коллизии и ставится 1 из пивотов туда, и так-же со вторым пивотом, затем проверка на дистанцию, если у ног приколлизии дистанция меньше .3, то перс стои, ежели не так, то другие варрианты. Насчёт головы, это если перс ударяется. Мэшь двигается исключительно по Yaw, а камера припивочена к верхнему пивоту и протиться вместе с ним, только ещё и по Pitch от мышки. Далее при примедании изменяется радиус элипсоида, и двигаются 2 пивота ног и головы, и при вставании обратно. Коллизия от патронов и всякого, осуществляется на Мэшь (Модель перса, которая тоже анимируется), это для реалистичности, притом при приседании, всё будет просто - анимация.

HolyDel 06.03.2007 01:51

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) - угадайте что.

moka 06.03.2007 02:09

Re: Реализация игрока в FPS
 
Коллизий может быть в один моммент не 1. Тут нужно вычеслить самую низкую и самую высшую.


Часовой пояс GMT +4, время: 19:00.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot