|
3D-программирование Вопросы, касающиеся программирования 3D мира |
04.05.2011, 11:06
|
#1
|
Разработчик
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений (для 319 пользователей)
|
Проблемы с коллизией
Добрый день всем!
Недавно начал программить на блице. Я зык хороший, но у меня возникла проблема с коллизией.
В общем, я, как обычно, вношу мяч и окружающий мир в коллизию группу. Затем идет проверка, нет ли коллизии, и если коллизии нет, мяч падает вниз(увеличивается скорость падения). Если коллизия есть, скорость падения умножается на -0.75.
Затем позиция мяча по y уменьшается на величину скорость падения.
Теперь сделаем под мячом, например, кубик.
Компилируем.
Мяч падает и отскакивает. Все работает. Автор радуется.
Но если придать кубику двивежие по оси y, мяч просто просачивается сквозь кубик.
Что не так?
Еще реализовано, что при нажатии пробела и присутствии коллизии мяч подпрыгивает (скорость падения=-1).
Но он будет прыгать даже если коснуться вертикальной стены. Эдакий спайдермен =(
Как определить, когда коллизия происходит с полом, а когда со стеной?
Ответьте пожалуйста на вопросы.
С уважением, PassCall
__________________
Мечта программиста: запрограммировать процесс программирования.
Всё гениальное - просто.
http://passcall.ucoz.com
Последний раз редактировалось PassCall, 04.05.2011 в 11:07.
Причина: ОшибкЕ
|
(Offline)
|
|
04.05.2011, 12:10
|
#2
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Проблемы с коллизией
Коллизии взаимно движущихся предметов не считаются.
Но с этим можно бороться.
Например есть группа объектов входящих в группу коллизий А и есть группа коллизий Б.
Тогда передвигаем только объекты группы А, вызываем CaptureWorld для фиксации их положения для физ. движка. Двигаем объекты группы Б, вызываем UpdateWorld. Должно работать.
И да незабыть назначить взаимные коллизии. А -> Б и Б -> А
Т.к. коллизии однонаправленные.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.05.2011, 15:12
|
#3
|
scientist.alien
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений (для 2,593 пользователей)
|
Ответ: Проблемы с коллизией
он будет прыгать даже если коснуться вертикальной стены. Эдакий спайдермен
|
Warning! Блитца под рукой нет, давно на нём не прогал, но в общем случае:
Решения! - Сделать всё, от чего отпрыгивать нельзя, другой коллизионной группой;
- Взять нормаль точки соприкосновения (вот не знаю, есть ли такая возможность в б3д) и проверить на вертикальность (по сути, т.к. нормаль всегда по длине = 1, достаточно взять Y-компоненту, и проверить её на близость к еденице, допустим (Y > 0. - тогда не прыгаем)
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab. We LOVE you. We MADE you.
|
(Offline)
|
|
11.05.2011, 14:33
|
#4
|
Разработчик
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений (для 319 пользователей)
|
Ответ: Проблемы с коллизией
Фишка в том, что если ПОДНИМАТЬ кубик, то коллизия работает нормально, но если ОПУСКАТЬ, то мяч сразу же просачивается.
__________________
Мечта программиста: запрограммировать процесс программирования.
Всё гениальное - просто.
http://passcall.ucoz.com
|
(Offline)
|
|
12.05.2011, 12:16
|
#5
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Проблемы с коллизией
Часть кода моей разработки "3D Platformer"
Collisions SolidPlayer,SolidWorld,2,2
While Not KeyDown(1)
If KeyDown(203) Then
RotateEntity Player1_Body,0,-180,0
MoveEntity Player1_Body,0,0,.04
End If
If KeyDown(205) Then
RotateEntity Player1_Body,0,0,0
MoveEntity Player1_Body,0,0,.04
End If
If KeyDown(57) And Player1_Fall=False Then
cg#=cjstrength#
Say$="летит -*-"
;Player1_Fly=True
Animate Player1_Body,1,.34
End If
Player1_Fall=True
If cg#<-0.01 Then Player1_Fly=True
For x=1 To CountCollisions(Player1_Body)
If GetEntityType(CollisionEntity(Player1_Body,x))=Sol idWorld
Select CollisionNX(Player1_Body,x)
Case 1
Say$="стена сдали ^~"
Case -1
Say$="стена вблизи ~v"
End Select
Select CollisionNY(Player1_Body,x)
Case 1
If Player1_Fly=True Then
Player1_Fly=False
RunSndCh=PlaySound(Steps)
End If
cg#=0.0
Player1_Fall=False
Say$="упал на низ v"
Case -1
cg#=0.0
RunSndCh=PlaySound(UpPush)
Say$="удар сверху ^"
End Select
Select CollisionNZ(Player1_Body,x)
Case 1
Say$="стена слева <"
Case -1
Say$="стена справа >"
End Select
EndIf
Next
If Player1_Fall=True Then cg#=cg#-gravity#
TranslateEntity Player1_Body,0,cg#,0
UpdateWorld
AimCamera2D(Player1_Body,Player1_Body,20)
;ARenderWorld(Camera1) ; тени от AShadows
Text 5,5,Say
Text 5,20,cg
Flip
Wend
|
видео демонстрация
правильней будет: запретить управлять перемещением, когда игрок в воздухе
Сообщение от PassCall
Фишка в том, что если ПОДНИМАТЬ кубик, то коллизия работает нормально, но если ОПУСКАТЬ, то мяч сразу же просачивается.
|
Кубик находится сверху?
В моём коде я приделал перемещение туда-сюда по Y одному кубу.. Когда игрок спускается вместе с кубиком - всё норм.
Когда кубик поднимается (против гравитации игрока) - игрок падает ("просачивается сквозь кубик")
В стандартном примере "Dynamic Collision Lib.bb" с этим всё впорядке.
(там "соединяют парами" взаимно двигающиеся объекты. Function DCO_SetPair)
|
(Offline)
|
|
12.05.2011, 12:22
|
#6
|
Дэвелопер
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений (для 1,540 пользователей)
|
Ответ: Проблемы с коллизией
CollisionNY( entity, collision_number )
__________________
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:18.
|