October 28, 2020, 06:14:06 AM

Author Topic: [bb] Ball rolling example by Jeppe Nielsen [ 1+ years ago ]  (Read 1243 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Ball rolling example
Author : Jeppe Nielsen
Posted : 1+ years ago

Description : Shows how you can make a ball roll

Code :
Code: BlitzBasic
  1. ;Ball rolling physics example by Jeppe Nielsen 2003
  2.  
  3. Const gravity#=-0.04;-0.02 ;gravity constant
  4.  
  5. Graphics3D 800,600,16,1
  6.  
  7. Const ball_col=1
  8. Const world_col=2
  9.  
  10. Collisions ball_col,world_col,2,2
  11.  
  12. Global texture
  13.  
  14. texture=CreateTexture(16,16)
  15.  
  16. SetBuffer TextureBuffer(texture)
  17.  
  18. Color 255,255,255
  19. Rect 0,0,16,16,1
  20.  
  21. Color 255,0,0
  22. Rect 0,0,8,8,1
  23. Rect 8,8,8,8,1
  24.  
  25. ScaleTexture texture,0.1,0.1
  26.  
  27.  
  28. Global groundtexture=CreateTexture(32,32,1+8)
  29.  
  30. SetBuffer TextureBuffer(groundtexture)
  31.  
  32. Color 0,0,0
  33. Rect 0,0,32,32,1
  34.  
  35. Color 0,0,255
  36. Rect 0,0,32,32,0
  37.  
  38. ScaleTexture groundtexture,2,2
  39.  
  40. SetBuffer BackBuffer()
  41. Color 255,255,255
  42.  
  43. plane=CreatePlane()
  44. EntityTexture plane,groundtexture
  45. EntityType plane,world_col
  46. EntityAlpha plane,0.5
  47.  
  48. mirror=CreateMirror()
  49.  
  50.  
  51.  
  52.  
  53. light=CreateLight(1)
  54. RotateEntity light,30,20,0
  55.  
  56.  
  57. obj=CreateCube()
  58.  
  59. EntityType obj,world_col
  60. PositionEntity obj,0,0,0
  61. ScaleEntity obj,10,10,10
  62. RotateEntity obj,45,0,0
  63.  
  64.  
  65.  
  66. camera=CreateCamera()
  67. CameraClsColor camera,0,0,255
  68.  
  69.  
  70. ball.ball=ballnew(0,4,-120,2,0.8)
  71.  
  72.  
  73. zoom#=14
  74.  
  75. Repeat
  76.  
  77. zoom#=zoom#-MouseZSpeed()
  78. ballcamera(camera,ball,0,zoom#,-zoom#,0,5,0)
  79.  
  80.  
  81. ballcontrol()
  82. ballupdate()
  83.  
  84. RenderWorld()
  85.  
  86. Text 10,10,"Arrow keys to control ball"
  87. Text 10,30,"Scroll on mouse to zoom"
  88.  
  89.  
  90. Flip
  91.  
  92.  
  93. Until KeyDown(1)
  94. End
  95.  
  96.  
  97. Type ball
  98.  
  99. Field e ;entity
  100.  
  101. Field sphere
  102.  
  103. Field pivot
  104.  
  105. Field x#,y#,z# ; position in 3d-space
  106.  
  107. Field vx#,vy#,vz# ; velocity
  108.  
  109. Field ax#,ay#,az# ; acceleration
  110.  
  111. Field size#
  112.  
  113. Field bounce# ; bounce factor
  114.  
  115. Field vel#
  116.  
  117. Field vx2#,vy2#,vz2# ; temp velocity
  118.  
  119. End Type
  120.  
  121.  
  122. Function ballnew.ball(x#,y#,z#,size#=1,bounce#=0.9)
  123.        
  124.         c.ball=New ball
  125.        
  126.         cx#=x#
  127.         cy#=y#
  128.         cz#=z#
  129.        
  130.         csize=size
  131.        
  132.         counce#=bounce#
  133.        
  134.         ce=CreatePivot()
  135.                
  136.         csphere=CreateSphere(64)
  137.        
  138.         cpivot=CreatePivot()
  139.        
  140.         EntityType ce,ball_col
  141.         EntityRadius ce,csize
  142.        
  143.         PositionEntity ce,cx,cy,cz
  144.         ScaleEntity csphere,csize,csize,csize
  145.        
  146.         EntityTexture csphere,texture
  147.        
  148.         Return c
  149.        
  150. End Function
  151.  
  152. Function ballupdate()
  153.        
  154.         For c.ball=Each ball
  155.        
  156.                        
  157.                 cvy#=cvy#+gravity#
  158.                
  159.                 cvx#=cvx#+cax#
  160.                 cvy#=cvy#+cay#
  161.                 cvz#=cvz#+caz#
  162.                
  163.                 cx#=EntityX(ce)
  164.                 cy#=EntityY(ce)
  165.                 cz#=EntityZ(ce)
  166.                
  167.                 TranslateEntity ce,cvx,cvy,cvz 
  168.        
  169.         Next
  170.        
  171.         UpdateWorld()
  172.                
  173.         For c.ball=Each ball
  174.        
  175.                 ;correct velocity if collided
  176.                 cvx2=(EntityX(ce)-cx)
  177.                 cvy2=(EntityY(ce)-cy)
  178.                 cvz2=(EntityZ(ce)-cz)
  179.                
  180.                 cx#=EntityX(ce)
  181.                 cy#=EntityY(ce)
  182.                 cz#=EntityZ(ce)
  183.                
  184.                 PositionEntity csphere,cx,cy,cz
  185.                 PositionEntity cpivot,cx,cy,cz
  186.                
  187.                 If EntityCollided(ce,world_col)
  188.                                
  189.                         For i = 1 To CountCollisions(ce)
  190.                                 ; Get the normal of the surface which the entity collided with.
  191.                                 Nx# = CollisionNX(ce, i)
  192.                                 Ny# = CollisionNY(ce, i)
  193.                                 Nz# = CollisionNZ(ce, i)
  194.                                
  195.                                 ; Compute the dot product of the entity's motion vector and the normal of the surface collided with.
  196.                                 VdotN# = cvx#*Nx# + cvy#*Ny# + cvz#*Nz#
  197.                                
  198.                                 ; Calculate the normal force.
  199.                                 NFx# = -2.0 * Nx# * VdotN#
  200.                                 NFy# = -2.0 * Ny# * VdotN#
  201.                                 NFz# = -2.0 * Nz# * VdotN#
  202.                                
  203.                                 ; Add the normal force to the direction vector.
  204.                                 cvx# = cvx# + NFx# * counce#
  205.                                 cvy# = cvy# + NFy# * counce#
  206.                                 cvz# = cvz# + NFz# * counce#
  207.  
  208.                                 avx#=EntityPitch(csphere)
  209.                                 avy#=EntityYaw(csphere)
  210.                                 avz#=EntityRoll(csphere)
  211.  
  212.                                 ;Rotate stuff
  213.                                 ;Get vector from center to collision
  214.                                 dx1#=(CollisionX(ce,i)-cx)
  215.                                 dy1#=(CollisionY(ce,i)-cy)
  216.                                 dz1#=(CollisionZ(ce,i)-cz)
  217.                                
  218.                                 dx2#=cvx
  219.                                 dy2#=cvy
  220.                                 dz2#=cvz
  221.                                
  222.                                 ;Cross product
  223.                                 cx# = ( dy1 * dz2 ) - ( dz1 * dy2 )
  224.                                 cy# = ( dz1 * dx2 ) - ( dx1 * dz2 )
  225.                                 cz# = ( dx1 * dy2 ) - ( dy1 * dx2 )                            
  226.                                                                                                                        
  227.                                 AlignToVector cpivot,cx,cy,cz,1
  228.                                                                                                                                                                                                        
  229.                         Next
  230.                        
  231.                         Nx# = CollisionNX(ce, 1)
  232.                         Ny# = CollisionNY(ce, 1)
  233.                         Nz# = CollisionNZ(ce, 1)                               
  234.                                        
  235.                         AlignToVector ce,Nx#,Ny#,Nz#,2,0.5
  236.                        
  237.                         cvel#=Sqr(cvx2*cvx2+cvy2*cvy2+cvz2*cvz2)
  238.                                                
  239.                         ;slow down due to friction
  240.                         cvx#=cvx*0.98
  241.                         cvy#=cvy*0.98
  242.                         cvz#=cvz*0.98
  243.                                        
  244.  
  245.                 EndIf
  246.  
  247.                        
  248.                 EntityParent csphere,cpivot
  249.                                                                
  250.                 TurnEntity cpivot,-cvel#*(180/Pi)/csize#,0,0
  251.  
  252.                 EntityParent csphere,0
  253.  
  254.                 cax#=0
  255.                 cay#=0
  256.                 caz#=0 
  257.                
  258.         Next
  259.        
  260. End Function
  261.  
  262.  
  263. Function ballcontrol()
  264.        
  265.         For c.ball=Each ball
  266.                
  267.                 If KeyDown(200)
  268.                        
  269.                         TFormVector 0,0,0.03,ce,0
  270.                        
  271.                         cax#=TFormedX()
  272.                         cay#=TFormedY()
  273.                         caz#=TFormedZ()
  274.                        
  275.                 EndIf
  276.                
  277.                 If KeyDown(208)
  278.                        
  279.                         cvx=cvx*0.94
  280.                         cvy=cvy*0.94
  281.                         cvz=cvz*0.94
  282.                        
  283.                 EndIf
  284.                
  285.                 If KeyDown(57)
  286.                        
  287.                         TFormVector 0,0.05,0,ce,0
  288.                        
  289.                         cax#=cax+TFormedX()
  290.                         cay#=cay+TFormedY()
  291.                         caz#=caz+TFormedZ()
  292.                        
  293.                                                                        
  294.                 EndIf
  295.                
  296.                 If KeyDown(203)
  297.                        
  298.                         TurnEntity ce,0,2,0
  299.                        
  300.                 EndIf
  301.                
  302.                 If KeyDown(205)
  303.                        
  304.                         TurnEntity ce,0,-2,0
  305.                        
  306.                 EndIf
  307.                
  308.                
  309.         Next
  310.        
  311.        
  312.        
  313. End Function
  314.  
  315. Function ballcamera(camera,b.ball,camx#,camy#,camz#,aimx#=0,aimy#=0,aimz#=0,smoothcam#=0.1,roll#=0)
  316.        
  317.         TFormPoint camx#,camy#,camz#,be,0
  318.        
  319.         dx#=(TFormedX()-EntityX(camera))*smoothcam#
  320.         dy#=(TFormedY()-EntityY(camera))*smoothcam#
  321.         dz#=(TFormedZ()-EntityZ(camera))*smoothcam#
  322.        
  323.         TranslateEntity camera,dx,dy,dz
  324.        
  325.         TFormPoint aimx#,aimy#,aimz#,be,0
  326.        
  327.         dx# = EntityX(camera)-TFormedX()
  328.         dy# = EntityY(camera)-TFormedY()
  329.         dz# = EntityZ(camera)-TFormedZ()
  330.         dist#=Sqr#((dx#*dx#)+(dz#*dz#))
  331.         pitch#=ATan2(dy#,dist#)
  332.         yaw#=ATan2(dx#,-dz#)
  333.        
  334.         RotateEntity camera,pitch#,yaw#,roll#
  335.        
  336. End Function


Comments :


Q(Posted 1+ years ago)

 My current project involves controlling a ball, this has pointed me in the right direction.  Thanks! :o)


Jeepster(Posted 1+ years ago)

 cool. I just have one question:what part(s) of the code make an object solid? when I try to add another cube, the ball rolls right through it!


Jeepster(Posted 1+ years ago)

 wait, never mind, I got itanyway, good show. I also have a project that involves controlling a ball


puki(Posted 1+ years ago)

 This is great.


Curtastic(Posted 1+ years ago)

 This is awesome. I thought the ball was jerking but it was just the camera. For now something like this can be used to make it smooth.
Code: [Select]
Function ballcamera(camera,b.ball,camx#,camy#,camz#,aimx#=0,aimy#=0,aimz#=0,smoothcam#=0.1,roll#=0)
TFormPoint camx#,camy#,camz#,be,0

dx#=(TFormedX()-EntityX(camera))*smoothcam#
dz#=(TFormedZ()-EntityZ(camera))*smoothcam#

TranslateEntity camera,dx,0,dz
PositionEntity camera,EntityX(camera),EntityY(be)+15,EntityZ(camera)
PointEntity camera,be
End Function



Rook Zimbabwe(Posted 1+ years ago)

 This is cool also! OK Jieppe Gets my vote for BLitzgy of the year!!!


Captain Wicker (crazy hillbilly)(Posted 1+ years ago)

 This code may be almost a decade old, but it still rocks!


GaryV(Posted 1+ years ago)

 R.I.P. Rook Zimbabwe :( [/i]

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal