Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 01.04.2008, 13:03   #1
KRIK
Бывалый
 
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений
(для 3 пользователей)
Правельно распределить

Люди! Может кто знает где информацию почитать или может сам кто-нить напишет как правильно распределять типы коллизий для мира в игре и вообще как правильно распределить объекты в игре к нужным типам. Например, чтобы не получилось так, чтобы человек мог лазить по стенкам, словно человек паук. Если кто не понял, могу более понятно написать))))
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 13:09   #2
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Правельно распределить

чтобы человек не лазил постенкам можно написать простенький код, типо:
colY# = CollisionY(player, n) - EntityY( player, 1 )
If colY# < 0 then
; тут код чтобы человечек мог перемещатся
EndIf
Объясняю, CoY возвратит место в мировых координатах на коллизионной сфере где было столкновение, так можно определить есть ли земля под ногами у игрока.

Вообще типы коллизий устанавливаются по необходимости нужным объектам, для всего что не будет контактировать с плеером, а только коллизится можно сделать тип StaticCol.
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 14:45   #3
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Правельно распределить

Hanon, false. все равно сможет лазить. например прыжог зажмет. или еще как изловчиться. какие еще есть предложения? (я не смог победить ету проблему пару лет назад).
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 15:14   #4
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Ответ: Правельно распределить

Это довольно сложно
Каждый решает по-своему.
Например у меня две сферы коллизии - одна в ногах для гравитации, другая на корпус для стен.
И жутко замученный код для совмещения всего этого.
Для начинающего пойдет и примитивный с лазаньем по стенам.
все равно он нифига не поймет, выложи я сейчас исходник (я порой сам не пойму что я там понаписывал ))))
__________________
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 16:31   #5
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Правельно распределить

Сообщение от HolyDel Посмотреть сообщение
Hanon, false. все равно сможет лазить. например прыжог зажмет. или еще как изловчиться. какие еще есть предложения? (я не смог победить ету проблему пару лет назад).
у меня все пашет, на прыжок делаю условие, если есть коллизия в ногах, то только тогда можно прыгать, плюс юзаю такую конструкцию( это когда тип коллизии стоит Collisions player, level, 2, 3 ), чтобы плеер, если поднялся на стенку, то съезжал оттуда обратно:
For n = 1 To CountCollisions( player(1)\entity )
            coly = CollisionY(player(1)\entity, n)-plY
            If coly < nogi Then 
                nx = 0
                nz = 0
                Exit
            Else
                nx = nx + CollisionNX(player(1)\entity, n)
                nz = nz + CollisionNZ(player(1)\entity, n)
            EndIf
        Next
        nx = nx / CountCollisions( player(1)\entity )
        nz = nz / CountCollisions( player(1)\entity )

TranslateEntity( player(1)\entity, nx * 0.02, Gravity, nz * 0.02, 1 )
Там есть еще продолжение, потому что в таком случае исчезнет один лаг, и появится новый, я его поборол но черезжопно.
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 18:05   #6
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Правельно распределить

Юзаю PhysX, хотя и нативной коллизией не сложно реализовать.
В общем принцип таков:
1. Определяешь стоит ли персонаж (стоит ли на ногах).
2. Исходя из этого (True/False), уже реализуешь управление персонажем.

Как вычислить стоит ли. Ну вопервых координата коллизии, должна быть в радиусе ног (можно тупо к координате Y прицепить).
Второе, нужно определить вектор коллизии (CollisionN[X/Y/Z]). Перевести в градус и сделать ограничение. Если градус на 50-100% паралелен вертикали гравитации - то перс стоит, в обратном случае, он уже не стоит а скользит или т.п.

Таким образом я делаю коллизию, выходит весьма шустро и без проблем нормально работает
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 19:19   #7
KRIK
Бывалый
 
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Правельно распределить

2Moka довольно интересный подход.. Только я немного про вектор коллизии не понял, а именно каким образом определить. Если я правельно понимаю то нада определять вектор относительно места прыжка?
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 19:20   #8
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Правельно распределить

вот именно это скольжение и вызвало у меня затруднения. Так как реакцию на коллизию оказывается нельзя менять после того как один раз задал, поэтому приходится писать свой алгоритм скольжения.
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 19:35   #9
KRIK
Бывалый
 
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Правельно распределить

H@NON! Я конеш не супер блитсер, но вот что я нашёл в справке по поводу Collisions. Разве это не смена коллизиии???

.....

; Change collision method 
If KeyHit( 50 )=True 
method=method+1 
If method=4 Then method=1 
If method=1 Then method_info$="ellipsoid-to-sphere" 
If method=2 Then method_info$="ellipsoid-to-polygon" 
If method=3 Then method_info$="ellipsoid-to-box" 
EndIf 

; Change collision response 
If KeyHit( 19 )=True 
response=response+1 
If response=4 Then response=1 
If response=1 Then response_info$="stop" 
If response=2 Then response_info$="slide1" 
If response=3 Then response_info$="slide2" 
EndIf 

.....
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 19:36   #10
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Правельно распределить

неа. это смена текста
вообщето просто вызываешь collisions с нужными параметрами и все. хотя, может есть какие то подводные камни.
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 19:38   #11
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Правельно распределить

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

Юзай функцию DebugLog и Stop, чтобы можно было вывести некоторые параметры и остановить программу.
(Offline)
 
Ответить с цитированием
Старый 01.04.2008, 19:56   #12
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Правельно распределить

непонимаю, у меня в проекте смена коллизий не происходила...
(Offline)
 
Ответить с цитированием
Старый 20.04.2008, 17:21   #13
avel
Бывалый
 
Аватар для avel
 
Регистрация: 12.10.2006
Сообщений: 737
Написано 131 полезных сообщений
(для 452 пользователей)
Ответ: Правельно распределить

люди, все гораздо проще! предложу очень тупой, но очень действенный способ... просто, юзаем два типа... один для стен, другой для пола... и все!
(Offline)
 
Ответить с цитированием
Старый 21.04.2008, 13:55   #14
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Правельно распределить

avel, не очень хороший варриант
Если у тебя сложная форма, тогда нада заморачиватся моделлеру, разбивая на части..
(Offline)
 
Ответить с цитированием
Старый 21.04.2008, 16:56   #15
AnyWay
Оператор ЭВМ
 
Регистрация: 08.09.2007
Сообщений: 47
Написано 0 полезных сообщений
(для 0 пользователей)
Re: Ответ: Правельно распределить

Сообщение от MoKa Посмотреть сообщение
avel, не очень хороший варриант
Если у тебя сложная форма, тогда нада заморачиватся моделлеру, разбивая на части..
Да ладно, классный способ. Дешево и сердито. В 99% не используются формы которые тяжело разбить на пол и стены, а где используются тоже проблем у моделера не много. Зато не надо отдельные сферы коллизий для ног и головы делать. Вот где действительно заморочки.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com