Collision Detection

Blitz3D Forums/Blitz3D Programming/Collision Detection

Rainking(Posted 2003) [#1]
Is there a way to detect the angle of a collision? Eg: Is it a vertical or horizontal collision.

Thanks


Odds On(Posted 2003) [#2]
You can use CollisionNX() etc to work out the collision normal, and if CollisionNY() is bigger than the other two it's vertical otherwise its horizontal.


Rainking(Posted 2003) [#3]
I'm having a problem in that even when two object pass next to each other they are having a collision effect. I want them to be able to pass side by side without causing them to "collide".

Any way to do this?


Rainking(Posted 2003) [#4]
Okay I am getting somewhere with this, however there are a few nuances. This is my first experiment with Blitz in quite a long time so excuse the basic nature of it.

Here's my code:

[CODE]
;;;;;;;;;;;;;;;;;;;;
; ;
; Main starts here ;
; ;
;;;;;;;;;;;;;;;;;;;;

Graphics3D 800,600

SetBuffer BackBuffer()

Camera = CreateCamera()

CameraViewport Camera,0,0,GraphicsWidth(),GraphicsHeight()

Block = InitGame()

Timer = CreateTimer(10)

While Not KeyHit(1)

x = 0
y = -2

If KeyHit(203)

If Not EntityCollided(Block,1)

x = - 2

End If

End If

If KeyHit(205)

If Not EntityCollided(Block,1)

x = 2

End If

End If

If EntityCollided(Block,1)

If CollisionNY(Block,1) => CollisionNX(Block,1)

Block = NewBlock()

Else

EntityType Block,3

TranslateEntity Block,x,y,0

EntityType Block,1

End If


Else

TranslateEntity Block,x,y,0

End If

UpdateWorld

RenderWorld

Flip

WaitTimer(Timer)

Wend

;;;;;;;;;;;;;;;;;;;;
; ;
; Main ends here ;
; ;
;;;;;;;;;;;;;;;;;;;;


Function InitGame()

For a = 0 To 20 Step 2

x = -10 + a

BottomWall = CreateSprite()
PositionEntity BottomWall,x,-20,30
EntityType BottomWall,1

Next

For a = 0 To 40 Step 2

y = 20 - a

LeftWall = CreateSprite()
PositionEntity LeftWall,-12,y,30
EntityType LeftWall,1

RightWall = CreateSprite()
PositionEntity RightWall,12,y,30
EntityType RightWall,1

Next


Block = NewBlock()

Collisions 1,1,1,1

Return Block

End Function

Function NewBlock()

Block = CreateSprite()
PositionEntity Block,0,22,30
EntityType Block,1
EntityColor Block,Rand(255),Rand(255),Rand(255)

Return Block

End Function
[/CODE]

Cursors move the blocks left and right.

The problems are that if you go against the right wall the block stops, but against the left wall it keeps going (I over-ride the collision if it isn't a top-bottom collision, or at least that's the intention).

Also if you put the blocks in a certain way one on top of the other, and then one to the right, dropping another block on the right bottom one will cause the new block to go over it rather than on top.

If you could shed any light on this, and also perhaps suggest better ways to do what I am doing I would appreciate that.

Thanks


Rainking(Posted 2003) [#5]
Okay new code - solved alot of the problems by using cubes and setting the collision radius.

However still having problems with it hitting the right wall and stopping, and also if you keep moving it into lines of blocks on the left or right it will stop too.

[CODE]
;;;;;;;;;;;;;;;;;;;;
; ;
; Main starts here ;
; ;
;;;;;;;;;;;;;;;;;;;;

Graphics3D 800,600

SetBuffer BackBuffer()

Camera = CreateCamera()

CameraViewport Camera,0,0,GraphicsWidth(),GraphicsHeight()

Block = InitGame()

Timer = CreateTimer(10)

While Not KeyHit(1)

x = 0
y = -2

If KeyHit(203)

If Not EntityCollided(Block,1)

x = - 2

End If

End If

If KeyHit(205)

If Not EntityCollided(Block,1)

x = 2

End If

End If

If EntityCollided(Block,1)

If CollisionNY(Block,1) >= CollisionNX(Block,1)

Block = NewBlock()

Else

EntityType Block,3

TranslateEntity Block,x,y,0

EntityType Block,1

End If


Else

TranslateEntity Block,x,y,0

End If

UpdateWorld

RenderWorld

Flip

WaitTimer(Timer)

Wend

;;;;;;;;;;;;;;;;;;;;
; ;
; Main ends here ;
; ;
;;;;;;;;;;;;;;;;;;;;


Function InitGame()

For a = 0 To 20 Step 2

x = -10 + a

BottomWall = CreateCube()
PositionEntity BottomWall,x,-20,30
EntityType BottomWall,1

Next

For a = 0 To 40 Step 2

y = 20 - a

LeftWall = CreateCube()
PositionEntity LeftWall,-12,y,30
EntityType LeftWall,1

RightWall = CreateCube()
PositionEntity RightWall,12,y,30
EntityType RightWall,1

Next


Block = NewBlock()

Collisions 1,1,1,1

Return Block

End Function

Function NewBlock()

Block = CreateCube()
EntityRadius Block,0.5
PositionEntity Block,0,22,30
EntityType Block,1
EntityColor Block,Rand(255),Rand(255),Rand(255)

Return Block

End Function
[/CODE]


Rainking(Posted 2003) [#6]
Worked it out - I just needed to detect whether the Y collision was 1.