Sparky is easy, and free. It comes with good help files and examples.
Here's one of the examples that comes with it(alot of code, but simple)
`set display mode 800,600,32
sync on
sync rate 0
autocam off
hide mouse
rem make some labels
cls
text 0,0,"Sphere Collision"
get image 1,0,0,130,15
cls
text 0,0,"Box Collision"
get image 2,0,0,110,15
cls
text 0,0,"Polygon Collision"
get image 3,0,0,140,15
cls
text 0,0,"Complex Collision (Polygon)"
get image 4,0,0,220,15
cls
text 0,0,"Group 1"
get image 5,0,0,60,15
cls
text 0,0,"Group 2"
get image 6,0,0,60,15
cls
position camera 0,10,-60
point camera 0,10,0
rem group 1:
make object sphere 1,10
color object 1,rgb(200,0,0)
position object 1,-20,25,0
SC_setupObject 1,1,1 :`setup object 1, into group 1, with collision type sphere (1)
make object cube 3,10
color object 3,rgb(200,0,0)
position object 3,-20,10,0
SC_setupObject 3,1,2 :`setup object 3, into group 1, with collision type box (2)
make object cone 5,10
color object 5,rgb(200,0,0)
position object 5,-20,-5,0
SC_setupObject 5,1,0 :`setup object 5, into group 1, with collision type polygon (0)
make object sphere 7,10,50,50 :`(approx 5000 polygons)
color object 7,rgb(200,0,0)
position object 7,-20,-20,0
SC_setupComplexObject 7,1,2 :`setup object 7 as a complex object, into group 1, with 2 faces per tree node (explained later)
rem group 2:
make object sphere 2,10
color object 2,rgb(0,200,0)
position object 2,20,25,0
SC_setupObject 2,2,1 :`setup object 2, into group 2, with collision type sphere (1)
make object cube 4,10
color object 4,rgb(0,200,0)
position object 4,20,10,0
SC_setupObject 4,2,2 :`setup object 4, into group 2, with collision type box (2)
make object cone 6,10
color object 6,rgb(0,200,0)
position object 6,20,-5,0
SC_setupObject 6,2,0 :`setup object 6, into group 2, with collision type polygon (0)
make object sphere 8,10,50,50 :`(approx 5000 polygons)
color object 8,rgb(0,200,0)
position object 8,20,-20,0
SC_setupComplexObject 8,2,2 :`setup object 8 as a complex object, into group 2, with 2 faces per tree node (explained later)
makeColorImage(1,7,rgb(255,255,255))
`make some bullet markers
for i=10002 to 10040
make object plain i,3,3
texture object i,7
set object light i,0
hide object i
next i
rem make the labels
make object plain 100,15,1.5
texture object 100,1
ghost object on 100
position object 100,0,25,0
make object plain 101,11,1.5
texture object 101,2
ghost object on 101
position object 101,0,10,0
make object plain 102,14,1.5
texture object 102,3
ghost object on 102
position object 102,0,-5,0
make object plain 103,22,1.5
texture object 103,4
ghost object on 103
position object 103,0,-20,0
make object plain 104,6,1.5
texture object 104,5
ghost object on 104
position object 104,-20,35,0
make object plain 105,6,1.5
texture object 105,6
ghost object on 105
position object 105,20,35,0
`show object 10002
counter=10002
group=0
group$="all groups"
do
movex#=mousemovex()/10.0
movey#=mousemovey()/10.0
yrotate camera camera angle y()+(movex#+oldmovex#)/2.0
xrotate camera camera angle x()+(movey#+oldmovey#)/2.0
position mouse 400,300
oldmovex#=movex#
oldmovey#=movey#
if spacekey()=1 and rotatetimer+300<timer()
rotatetimer = timer()
for i=1 to 8
rotate object i,rnd(359),rnd(359),rnd(359)
rem UPDATE - update our object
SC_updateObject i
next i
for i=10002 to 10040
hide object i
next i
endif
if inkey$()="t" and ttimer+300<timer()
ttimer=timer()
toggletext=1-toggletext
endif
if returnkey()=1 and switchGroup+300<timer()
switchGroup=timer()
group=group+1
if group>2 then group=0
if group=0 then group$="all groups"
if group=1 then group$="group 1"
if group=2 then group$="group 2"
endif
if mouseclick()=1
rem get our simple collision vector
oldx#=camera position x()
oldy#=camera position y()
oldz#=camera position z()
move camera 2000
x#=camera position x()
y#=camera position y()
z#=camera position z()
move camera -2000
collide=SC_rayCastGroup(group,oldx#,oldy#,oldz#,x#,y#,z#,0)
if collide>0
rem get the collision point
newx#=SC_getStaticCollisionX()
newy#=SC_getStaticCollisionY()
newz#=SC_getStaticCollisionZ()
rem get collision normal
normx#=SC_getCollisionNormalX()
normy#=SC_getCollisionNormalY()
normz#=SC_getCollisionNormalZ()
rem position and point a marker in the right direction
position object counter,newx#+normx#/10.0,newy#+normy#/10.0,newz#+normz#/10.0
point object counter,newx#+normx#,newy#+normy#,newz#+normz#
show object counter
counter = counter + 1
if counter>10040 then counter = 10002
endif
endif
text 0,0,"Currently cheking for collision with: "+group$
text 0,20,"FPS: "+str$(screen fps())+" Polys: "+str$(statistic(1))
text 0,40,"Last Collision Object: "+str$(collide)
if toggletext=0
text 0,60,"Move mouse to aim, left click to shoot"
text 0,80,"Press space to randomly rotate objects."
text 0,100,"Press return to change groups"
text 0,120,"Press t to toggle this text"
endif
ink rgb(255,0,0),0
circle 400,300,10
dot 400,300
ink rgb(255,255,255),0
sync
loop
function makeColorImage(mem,image,color)
make memblock mem,16
write memblock dword mem,0,1
write memblock dword mem,4,1
write memblock dword mem,8,32
write memblock dword mem,12,color
make image from memblock image,mem
delete memblock mem
endfunction
end
`this line is never executed but we must include it so that DBPro
`knows to include the memblock commands into the exe (the dll uses them)
delete memblock 1
EDIT: btw, dark donkey's wrong, it's Sparky's
Collision System