|
3D-программирование Вопросы, касающиеся программирования 3D мира |
05.03.2007, 14:56
|
#1
|
AnyKey`щик
Регистрация: 18.10.2006
Сообщений: 6
Написано 0 полезных сообщений (для 0 пользователей)
|
Реализация игрока в 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 с комнатой.
Из-за меньшего радиуса он соприкасается только с полом а не со стеной.
В целом такая реализация срабатывает, но иногда наблюдается косяки. ИМХО все как то усложнено.Полагаю что я во многом перемудрил, вот и хотел узнать как подобное реализуют другие.
|
(Offline)
|
|
05.03.2007, 15:33
|
#2
|
Бывалый
Регистрация: 09.09.2006
Сообщений: 656
Написано 54 полезных сообщений (для 110 пользователей)
|
Re: Реализация игрока в FPS
мм а если это фпс зачем так мудрить просто камеру опускаешь при приседание, поднимаеш при прыжке
а игрок бокс или сфера за камерой
но ето мое мнение я так и делаю
|
(Offline)
|
|
05.03.2007, 16:08
|
#3
|
AnyKey`щик
Регистрация: 18.10.2006
Сообщений: 6
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация игрока в FPS
"опускаешь при приседание"
При приседании надо еще уменьшать высоту коллизии.
"поднимаеш при прыжке"
А как он перепрыгивать препятствие будет если только камеру поднимать
"а игрок бокс или сфера за камерой"
Все равно для просчета коллизий игрок будет сферой, но опять же как определять момент когда он может прыгнуть. К тому же если делать для коллизии высоту равную высоте игрока, то тогда этот игрок будет пешком на столы взбираться, потому что радиус большой получится
|
(Offline)
|
|
05.03.2007, 17:28
|
#4
|
Дэвелопер
Регистрация: 19.03.2006
Сообщений: 1,241
Написано 10 полезных сообщений (для 17 пользователей)
|
Re: Реализация игрока в FPS
Ничего подобного, если ты делаеш фпс, тебе нужин игрок высотой-4, и ты делаеш EntityRadius Игрок,4 то у тебя получается большая сфера
Тебе поможет такой вариант EntityRadius Игрок,1,4
PS/ что именно в крации тебе непонятно(аспекты)
|
(Offline)
|
|
05.03.2007, 22:07
|
#5
|
AnyKey`щик
Регистрация: 18.10.2006
Сообщений: 6
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Реализация игрока в FPS
Сообщение от vlad
Ничего подобного, если ты делаеш фпс, тебе нужин игрок высотой-4, и ты делаеш EntityRadius Игрок,4 то у тебя получается большая сфера
Тебе поможет такой вариант EntityRadius Игрок,1,4
|
Хочешь сказать эллипс а не сфера.
Сообщение от vlad
PS/ что именно в крации тебе непонятно(аспекты)
|
Например как при такой реализации (камера и 1 пивот) определить момент когда игрок может прыгать, а когда нет, учитывая что пол и стены принадлежат одному объекту?
|
(Offline)
|
|
05.03.2007, 22:36
|
#6
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Реализация игрока в FPS
Я реализовал физ поведение перса как в HL2, там у меня меэшь, с коллизией элипсоидной ( EntityRadius Mesh,.5,1.7 ). 2 пивота, у ног и чуть ниже самого верха элипсоида, припивочены к Мэшу. И ещё 2 пивота, при коллизии вычесляется самая нижняя точка коллизии и ставится 1 из пивотов туда, и так-же со вторым пивотом, затем проверка на дистанцию, если у ног приколлизии дистанция меньше .3, то перс стои, ежели не так, то другие варрианты. Насчёт головы, это если перс ударяется. Мэшь двигается исключительно по Yaw, а камера припивочена к верхнему пивоту и протиться вместе с ним, только ещё и по Pitch от мышки. Далее при примедании изменяется радиус элипсоида, и двигаются 2 пивота ног и головы, и при вставании обратно. Коллизия от патронов и всякого, осуществляется на Мэшь (Модель перса, которая тоже анимируется), это для реалистичности, притом при приседании, всё будет просто - анимация.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.03.2007, 01:51
|
#7
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
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) - угадайте что.
|
(Offline)
|
|
06.03.2007, 02:09
|
#8
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Реализация игрока в FPS
Коллизий может быть в один моммент не 1. Тут нужно вычеслить самую низкую и самую высшую.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:03.
|