forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Проблемы с коллизией (http://forum.boolean.name/showthread.php?t=14664)

PassCall 04.05.2011 11:06

Проблемы с коллизией
 
Добрый день всем!
Недавно начал программить на блице. Я зык хороший, но у меня возникла проблема с коллизией.

В общем, я, как обычно, вношу мяч и окружающий мир в коллизию группу. Затем идет проверка, нет ли коллизии, и если коллизии нет, мяч падает вниз(увеличивается скорость падения). Если коллизия есть, скорость падения умножается на -0.75.
Затем позиция мяча по y уменьшается на величину скорость падения.

Теперь сделаем под мячом, например, кубик.

Компилируем.
Мяч падает и отскакивает. Все работает. Автор радуется.
Но если придать кубику двивежие по оси y, мяч просто просачивается сквозь кубик.

Что не так?

Еще реализовано, что при нажатии пробела и присутствии коллизии мяч подпрыгивает (скорость падения=-1).
Но он будет прыгать даже если коснуться вертикальной стены. Эдакий спайдермен =(
Как определить, когда коллизия происходит с полом, а когда со стеной?

Ответьте пожалуйста на вопросы.
С уважением, PassCall

SBJoker 04.05.2011 12:10

Ответ: Проблемы с коллизией
 
Коллизии взаимно движущихся предметов не считаются.
Но с этим можно бороться.
Например есть группа объектов входящих в группу коллизий А и есть группа коллизий Б.
Тогда передвигаем только объекты группы А, вызываем CaptureWorld для фиксации их положения для физ. движка. Двигаем объекты группы Б, вызываем UpdateWorld. Должно работать.

И да незабыть назначить взаимные коллизии. А -> Б и Б -> А
Т.к. коллизии однонаправленные.

Taugeshtu 04.05.2011 15:12

Ответ: Проблемы с коллизией
 
Цитата:

он будет прыгать даже если коснуться вертикальной стены. Эдакий спайдермен
Warning! Блитца под рукой нет, давно на нём не прогал, но в общем случае:

Решения!
  1. Сделать всё, от чего отпрыгивать нельзя, другой коллизионной группой;
  2. Взять нормаль точки соприкосновения (вот не знаю, есть ли такая возможность в б3д) и проверить на вертикальность (по сути, т.к. нормаль всегда по длине = 1, достаточно взять Y-компоненту, и проверить её на близость к еденице, допустим (Y > 0.8) - тогда не прыгаем)

PassCall 11.05.2011 14:33

Ответ: Проблемы с коллизией
 
Фишка в том, что если ПОДНИМАТЬ кубик, то коллизия работает нормально, но если ОПУСКАТЬ, то мяч сразу же просачивается.

LLI.T.A.L.K.E.R. 12.05.2011 12:16

Ответ: Проблемы с коллизией
 
Часть кода моей разработки "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 (Сообщение 188108)
Фишка в том, что если ПОДНИМАТЬ кубик, то коллизия работает нормально, но если ОПУСКАТЬ, то мяч сразу же просачивается.

Кубик находится сверху?

В моём коде я приделал перемещение туда-сюда по Y одному кубу.. Когда игрок спускается вместе с кубиком - всё норм.
Когда кубик поднимается (против гравитации игрока) - игрок падает ("просачивается сквозь кубик")


В стандартном примере "Dynamic Collision Lib.bb" с этим всё впорядке.
(там "соединяют парами" взаимно двигающиеся объекты. Function DCO_SetPair)

mr.DIMAS 12.05.2011 12:22

Ответ: Проблемы с коллизией
 
CollisionNY( entity, collision_number )


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

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