Collision help!?

Blitz3D Forums/Blitz3D Beginners Area/Collision help!?

Duff(Posted 2010) [#1]
i just started messing with bilitz3D a few days ago and i don't understand how to get collisions to work. can someone please tell me what is wrong with the code below. i just want the sphere to collide with the cubes.


 
Graphics3D 800,600,32,0
SeedRnd MilliSecs()

Const coll_sphere=1
Const coll_box=2

Type boxdata
	Field x
	Field y
	Field z
	Field cube
End Type 
light=CreateLight() 

sphere=CreateSphere()
EntityType (sphere, coll_sphere)
ScaleEntity sphere,.5,.5,.5
EntityRadius sphere,.5,.5

camera=CreateCamera() 
PositionEntity camera ,0,0,-5
EntityParent camera,sphere


For x=1 To 20
		box.boxdata=New boxdata
			box\cube=CreateCube()
			box\x=Rnd(-50,50)
			box\y=Rnd(-50,50)
			box\z=Rnd(-50,50)
			PositionEntity box\cube ,box\x,box\y,box\z
			EntityType(box\cube,coll_box)
			EntityBox box\cube,-1,-1,-1,2,2,2

Next 

Collisions (coll_box,coll_sphere,3,1)

While Not KeyHit(1)



    If KeyDown(17) Then
       TurnEntity sphere,-1,0,0
    EndIf
    If KeyDown(30) Then
        TurnEntity sphere,0,1,0
    EndIf
    If KeyDown(31) Then
        TurnEntity sphere,1,0,0
    EndIf
    If KeyDown(32) Then
        TurnEntity sphere,0,-1,0
    EndIf
	

    If KeyDown(200) Then
        MoveEntity sphere,0,0,1
    EndIf
    If KeyDown(208) Then
        MoveEntity sphere,0,0,-1
    EndIf


	UpdateWorld 
	RenderWorld 

	For box.boxdata=Each boxdata
		If EntityCollided(box\cube,coll_sphere) Then EntityColor box\cube,230,100,220
	Next 

	Text 0,0,EntityX(sphere)
	Text 0,20,EntityY(sphere)
	Text 0,40,EntityZ(sphere)

	Flip 

Wend 


edit: fixed my dumb typos
edit:fixed entitybox


Nate the Great(Posted 2010) [#2]
didnt run it but it looks like you are setting the sphere collision type to s... s is 0 cuz you didnt define it... maybe trey coll_sphere

and when you define coll_sphere you spell it coll_shpere which is another possible problem :)

hope that helps

edit: lol you mispelled shpere twice the same way... is this on purpose?


Duff(Posted 2010) [#3]
@ nate the great
lol yes spelling it shpere was a dumb mistake using the replace tool in blitz. i had it in there like 5 times. lol

but anyways... it still doesn't collide when i run it. is there something wrong with the way i setup the collision code?


Stevie G(Posted 2010) [#4]
You got the definition of entitybox completely wrong, think of it like fit mesh:

This:

EntityType(box\cube,coll_box)
EntityBox box\cube,box\x,box\y,box\z,1,1,1


SHould be

EntityType(box\cube,coll_box)
EntityBox box\cube, -1,-1,-1,2,2,2


It should then work fine.

Basically you are defining the collision hull of the box from it's left/bottom/rear to right/top/front. During collisions, Blitz already knows what x,y,z coord the box is at as you told it by using positionentity.

Additonally, you do not need to store the box, x, y, z positions as you can get them by using entityx( box\cube ) , entityy( box\cube) entityz( box\cube )

Hope this helps.

Stevie


Duff(Posted 2010) [#5]
i fixed entitybox in the above code but The collision still does not work. if i switch the collision from:
Collisions (coll_box,coll_sphere,3,1)

For box.boxdata=Each boxdata
	If EntityCollided(box\cube,coll_sphere) Then EntityColor box\cube,230,100,220
Next 

To:
Collisions (coll_sphere,coll_box,3,1)

For box.boxdata=Each boxdata
	If EntityCollided(sphere,coll_box) Then EntityColor box\cube,230,100,220
Next 


the collision works fine on the second one but it changes the entitycolor of all of the cubes. i need it to work the first way so i can change the color, delete, etc. of only the one i collided with.


Stevie G(Posted 2010) [#6]
You can only have sphere to [something] collisions set up with the collisions command so that makes sense.

The second part should probably look more like this ...

Collisions (coll_sphere,coll_box,3,1)

For box.boxdata=Each boxdata
	If EntityCollided( box\cube, coll_sphere) Then EntityColor box\cube,230,100,220
Next 


The code below works better and faster as you do not need to iterate through each boxdata type to get the one you want. Also, use instancing - see MasterCube. Basically you create a master template, hide it and simply copy the entity and it's properties

At present you don't really need to access the type associated with the cube you're colliding with. In fact you don't even need a type at all as, like I said above, you can access the coords by using the entityx\y & z commands.

If you are planning on adding more properties to the 'boxdata' type and need access to them during the collision then this can be done with the object and handle commands. Give me a shout if you need this.

Graphics3D 800,600,32,0
SeedRnd MilliSecs()

Const coll_sphere=1
Const coll_box=2
Collisions coll_sphere,coll_box,3,1

Type boxdata
	Field x
	Field y
	Field z
	Field cube
End Type 

light=CreateLight() 

sphere=CreateSphere()
EntityType (sphere, coll_sphere)
ScaleEntity sphere,.5,.5,.5
EntityRadius sphere,.5,.5

camera=CreateCamera() 
PositionEntity camera ,0,0,-5
EntityParent camera,sphere

;create a master cube which can be instanced
MasterCube = CreateCube()
EntityType MasterCube, coll_box
EntityBox MasterCube, -1,-1,-1,2,2,2
HideEntity MasterCube

For x=1 To 20
	box.boxdata=New boxdata
	box\cube= CopyEntity( MasterCube )
	box\x=Rnd(-50,50)
	box\y=Rnd(-50,50)
	box\z=Rnd(-50,50)
	PositionEntity box\cube ,box\x,box\y,box\z
Next 


While Not KeyHit(1)

	If KeyDown(17) Then
       TurnEntity sphere,-1,0,0
    EndIf
    If KeyDown(30) Then
        TurnEntity sphere,0,1,0
    EndIf
    If KeyDown(31) Then
        TurnEntity sphere,1,0,0
    EndIf
    If KeyDown(32) Then
        TurnEntity sphere,0,-1,0
    EndIf

    If KeyDown(200) Then
        MoveEntity sphere,0,0,1
    EndIf
    If KeyDown(208) Then
        MoveEntity sphere,0,0,-1
    EndIf

	UpdateWorld 
	RenderWorld 

	For c = 1 To CountCollisions( sphere )
		Entity = EntityCollided( sphere, coll_box )
		EntityColor Entity, 230,100,220
	Next

	Text 0,0,EntityX(sphere)
	Text 0,20,EntityY(sphere)
	Text 0,40,EntityZ(sphere)

	Flip 

Wend 


Stevie