Problem mit Collision

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Pro Soft

Betreff: Problem mit Collision

BeitragMi, Jun 09, 2010 15:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Ich habe ein Problem mit der Collision der Camera. Ich benutze ein paar Funktionen von anderen Programmierern doch nun weiß wir nicht wieso die Camera nicht mit den Objecten collidiert.

Code: [AUSKLAPPEN]

SeedRnd MilliSecs()

Include "oceanlib.bb"   ; i put all the watercode into oceanlib.bb, so you should be able to easily include it
                  ; into ya programms.

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

Global cam_x#,cam_z#,cam_pitch#,cam_yaw#                  ; Current
Global dest_cam_x#,dest_cam_z#,dest_cam_pitch#,dest_cam_yaw#   ; Destination

;sound

meer = LoadSound("meer.mp3")

PlaySound meer

; hmm, some camera thingies... boooring
;Global main_pivot = CreatePivot()
Global cam = CreateCamera();main_pivot)
MoveEntity cam,0,10,-100
TurnEntity cam,20,0,0
wat_gamecam = cam
CameraRange cam,1,50000
CameraFogMode cam,1
CameraFogRange cam,1000,1000
CameraFogColor cam,211,219,236
;PositionEntity cam, 2340, 0, 2390 ; 1394, 0, 4660 ;1298, 0, 4653 ; 3750, 45, 1370
;WireFrame 1

; loadin skybox
sky_mesh = LoadSkyBox()

; light
AmbientLight 255,255,255
main_light = CreateLight()
RotateEntity main_light,40,20,0



ter = LoadMesh("ohne titel 2.b3d")
PositionEntity ter,0,16,0
ScaleMesh ter,.05,.05,.05

;EntityPickMode ter,2,1


water.wat = Wat_CreateWater(16,16)
Wat_CreateSurface(water,40)


startms = MilliSecs()

EntityType cam,1
EntityType ter,2

Collisions 1,2,2,2

Repeat
   loops# = loops# + 1
   
   Aktuell = MilliSecs ()

   FreeLook(cam,.1)   
   
   Cls
      
   If KeyHit(57) Then wat_whitecaps = 1-wat_whitecaps
   
   ; render the water mesh every second frame
   
   If EntityY(cam) < 2 Then PositionEntity cam,EntityX(cam),2,EntityZ(cam)
   
   If Aktuell - Anfang >20 Then
   
      Wat_UpdateWater(water)
      Anfang=MilliSecs ()
         FPS=Frame
         Frame=0

   If KeyDown (200)
      MoveEntity cam, 0, 0, 0.5
   EndIf
   
   If KeyDown (208)
      MoveEntity cam, 0, 0, -0.5
   EndIf


   EndIf
   
   RenderWorld()

   
   ;Text 0,0,"fps: "+Int(1000/(MilliSecs()-lastmsc))
   Text 0,15,"averagefps: "+Int(1000/(Float((MilliSecs()-startms)/loops)))
   Text 0,30,"tris: "+TrisRendered()
   Text 0,45,"press space to enable/disable whitecaps"
   Text 0,60,"X: "+EntityX(cam)
   Text 0,70,"Y: "+EntityY(cam)
   Text 0,80,"Z: "+EntityZ(cam)
   lastmsc = MilliSecs()
   
   Flip 0
Until KeyHit(1)
End


Function LoadSkyBox( parent=0 )
   m=CreateMesh(parent)
   
   ;front face
   b=LoadBrush( "sky_f.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
   AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;right face
   b=LoadBrush( "sky_l.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
   AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;back face
   b=LoadBrush( "sky_b.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
   AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;left face
   b=LoadBrush( "sky_r.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
   AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   ;top face
   b=LoadBrush( "sky_u.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
   AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   b=LoadBrush( "sky_d.bmp",49 )
   s=CreateSurface( m,b )
   AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1
   AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0
   AddTriangle s,0,1,2:AddTriangle s,0,2,3
   FreeBrush b
   
   ScaleMesh m,500,500,500
   EntityOrder m,1
   FlipMesh m
   EntityFX m,1+8
   Return m
End Function

; just removes every tri that is completely under a certain y-coord to prevent some cubemappin problems
Function RemoveTrisUnderThePlane(mesh,planey#)
   Local nmesh = CreateMesh()
   Local vertex[2], nvertex[2]
   
   For s = 1 To CountSurfaces(mesh)
      sur = GetSurface(mesh,s)
      nsur = CreateSurface(nmesh,GetSurfaceBrush(sur))
      For t = 0 To CountTriangles(sur)-1
         temp = 0
         For i = 0 To 2
            vertex[i] = TriangleVertex(sur,t,i)
            If VertexY(sur,vertex[i]) > planey Then temp = 1
         Next
         If temp = 1
            For i = 0 To 2
               nvertex[i] = AddVertex(nsur,VertexX(sur,vertex[i]),VertexY(sur,vertex[i]),VertexZ(sur,vertex[i]),VertexU(sur,vertex[i]),VertexV(sur,vertex[i]),VertexW(sur,vertex[i]))
               VertexNormal nsur,nvertex[i],VertexNX(sur,vertex[i]),VertexNY(sur,vertex[i]),VertexNZ(sur,vertex[i])
               VertexColor nsur,nvertex[i],VertexRed(sur,vertex[i]),VertexGreen(sur,vertex[i]),VertexBlue(sur,vertex[i]),VertexAlpha(sur,vertex[i])
            Next
            AddTriangle nsur,nvertex[0],nvertex[1],nvertex[2]
         EndIf
      Next
   Next
   
   Return nmesh
End Function

Function CurveValue#(current#,destination#,curve)
   current#=current#+((destination#-current#)/curve)
   Return current#
End Function

Function FreeLook(camera, sp# = .1)
   If KeyDown(42) Then sp=sp*10
   If sp# > 0 Then
      FreeLookXS# = (FreeLookXS# + ((KeyDown(32)) - (KeyDown(30))) * sp#) * .75
      FreeLookZS# = (FreeLookZS# + ((KeyDown(17) Or (MouseZSpeed()*10)) - (KeyDown(31) Or (MouseZSpeed()*10))) * sp#) * .75
      MoveEntity camera, FreeLookXS#, 0, FreeLookZS#
   EndIf
   FreeLookRotXS# = ((MouseXSpeed() - FreeLookRotXS#) * .2 + FreeLookRotXS#) * .9
   FreeLookRotYS# = ((MouseYSpeed() - FreeLookRotYS#) * .2 + FreeLookRotYS#) * .9
   If EntityPitch(camera) + FreeLookRotYS# < -89 pitch# = -89 ElseIf EntityPitch(camera) + FreeLookRotYS# > 89 pitch# = 89 Else pitch# = EntityPitch(camera) + FreeLookRotYS#
   yaw# = -FreeLookRotXS# + EntityYaw(camera)
   RotateEntity camera, pitch#, yaw#, 0
   MoveMouse GraphicsWidth() / 2, GraphicsHeight() / 2
End Function


oceanlib.bb:

Code: [AUSKLAPPEN]
; waterlib, Inarie aka Mr.Keks, 2005
; mail@inarie.de
; www.inarie.de
; www.projectblitz.de


Type wat ; water tile / water class
   Field bank ; bank that contains the water wave time
   Field width,depth ; width and depth of the mesh in quads
   Field mesh,sur,sur2
   Field brush,brush2
   Field cam,tex ; cubemappin cam and tex
   Field tex2, anim#
End Type

Type wat_surf ; a water circle ^^
   Field w.wat ; tile class
   Field size
   Field piv
End Type

Type wat_meshc ; a single mesh instance of the wat tile
   Field s.wat_surf
   Field mesh
End Type


Global wat_gamecam ; handle of the main cam
Global wat_whitecaps = 1 ; disable or enable whitecaps on high waves

; save all sin()-values in order to save some render time
Dim sin2#(255)
For i = 0 To 255
   Sin2(i) = Sin(i*360/255)
Next



; function to create a water class
Function Wat_CreateWater.wat(width, depth)
   w.wat      = New wat
   
   w\width      = width
   w\depth      = depth
   
   w\mesh      = CreateMesh()
   w\brush      = CreateBrush()
   w\brush2      = LoadBrush("white.png",2,.5,.5)
   w\sur         = CreateSurface(w\mesh,w\brush)
   w\sur2      = CreateSurface(w\mesh,w\brush2)
   w\bank      = CreateBank(width * depth + 1)
   
   BrushFX w\brush,16
   BrushColor w\brush,70,90,110
   BrushShininess w\brush,.3
   
   BrushFX w\brush2,1+2+16+32
   PaintSurface w\sur2,w\brush2
   
   HideEntity w\mesh
   
   ResizeBank w\bank,width*depth+1
   
   w\tex = CreateTexture(256,256,1+128+256)
   
   w\tex2 = LoadAnimTexture("wateranim.bmp",256,124,124,0,25)
   ScaleTexture w\tex2,.6,.6
   TextureBlend w\tex2,3
   
   For i = 0 To width*depth
      PokeByte w\bank,i,Rand(255);+Sin(i*360/width)*129
   Next
   
   ScaleEntity w\mesh,1,1.001/256.001,1
   
   w\cam = CreateCamera()
   HideEntity w\cam
   
   Return w.wat
End Function

; function to create a water circle
Function Wat_CreateSurface.wat_surf(w.wat,fieldsize)
   s.wat_surf   = New wat_surf
   s\w         = w
   s\size      = fieldsize
   s\piv      = CreatePivot()
   For x = -fieldsize To fieldsize
      For y = -fieldsize To fieldsize
         If y*y < fieldsize*fieldsize-x*x
            If LinePick((x-.5)*w\width,200,(y-.5)*w\depth,0,-180,0,w\depth/2) = 0
               m.wat_meshc = New wat_meshc
               m\s         = s
               m\mesh      = CopyEntity(w\mesh,s\piv)
               PositionEntity m\mesh,(x-(x/2*2<>x)*1)*(w\width)-2*x,0,(y-(y/2*2<>y)*1)*(w\depth)-2*y
               ScaleEntity m\mesh,2*(x/2*2<>x)-1,1.001/256.001,2*(y/2*2<>y)-1
               EntityPickMode m\mesh,2,1
            EndIf
         EndIf
      Next
   Next
End Function

; function to update all water tiles of a certain water class
Function Wat_UpdateWater(w.wat)
   Local vertex[3]
   Local vertex2[3]
   Local vertstobechanged[124*2]
   ClearSurface w\sur
   ClearSurface w\sur2
   
   For x = 0 To w\width-1
      For z = 0 To w\depth-1
         flukt = PeekByte(w\bank,1*(x*w\depth+z))
         PokeByte(w\bank,1*(x*w\depth+z),flukt+2)
      Next
   Next
   
   sw# = 32 ; wave height
   
   For x = 1 To w\width-2
      For z = 1 To w\depth-2
         vertex[0] = AddVertex(w\sur,x,sw*Sin2(PeekByte(w\bank,x*w\depth+z)),z,Float(x)/w\width,Float(z)/w\depth,1)
         vertex[1] = AddVertex(w\sur,x,sw*Sin2(PeekByte(w\bank,x*w\depth+z+1)),z+1,Float(x)/w\width,Float(z+1)/w\depth,1)
         vertex[2] = AddVertex(w\sur,x+1,sw*Sin2(PeekByte(w\bank,x*w\depth+w\depth+z+1)),z+1,Float(x+1)/w\width,Float(z+1)/w\depth,1)
         vertex[3] = AddVertex(w\sur,x+1,sw*Sin2(PeekByte(w\bank,x*w\depth+w\depth+z)),z,Float(x+1)/w\width,Float(z)/w\depth,1)
         
         AddTriangle(w\sur, vertex[0], vertex[1], vertex[2])
           AddTriangle(w\sur, vertex[0], vertex[2], vertex[3]) 
      
         If wat_whitecaps ; draw those cool whitecaps onto high waves
            temp = 0
            For i2 = 0 To 3
               If VertexY(w\sur,vertex[i2])>sw/1.5
                  temp = temp + 1
               EndIf
            Next
            
            If temp > 0
               i3 = 0
               vertex2[0] = AddVertex(w\sur2,VertexX(w\sur,vertex[i3]),VertexY(w\sur,vertex[i3])+1,VertexZ(w\sur,vertex[i3]),VertexU(w\sur,vertex[i3]),VertexV(w\sur,vertex[i3]))
               VertexColor w\sur2,vertex2[0],255,255,255,(VertexY(w\sur,Vertex[i3])-sw/1.5)/sw*1.5
               i3 = 1
               vertex2[1] = AddVertex(w\sur2,VertexX(w\sur,vertex[i3]),VertexY(w\sur,vertex[i3])+1,VertexZ(w\sur,vertex[i3]),VertexU(w\sur,vertex[i3]),VertexV(w\sur,vertex[i3]))
               VertexColor w\sur2,vertex2[1],255,255,255,(VertexY(w\sur,Vertex[i3])-sw/1.5)/sw*1.5
               i3 = 2
               vertex2[2] = AddVertex(w\sur2,VertexX(w\sur,vertex[i3]),VertexY(w\sur,vertex[i3])+1,VertexZ(w\sur,vertex[i3]),VertexU(w\sur,vertex[i3]),VertexV(w\sur,vertex[i3]))
               VertexColor w\sur2,vertex2[2],255,255,255,(VertexY(w\sur,Vertex[i3])-sw/1.5)/sw*1.5
               i3 = 3
               vertex2[3] = AddVertex(w\sur2,VertexX(w\sur,vertex[i3]),VertexY(w\sur,vertex[i3])+1,VertexZ(w\sur,vertex[i3]),VertexU(w\sur,vertex[i3]),VertexV(w\sur,vertex[i3]))
               VertexColor w\sur2,vertex2[3],255,255,255,(VertexY(w\sur,Vertex[i3])-sw/1.5)/sw*1.5
               
               AddTriangle(w\sur2,vertex2[0],vertex2[1],vertex2[2])
               AddTriangle(w\sur2,vertex2[0],vertex2[2],vertex2[3])
            EndIf
         EndIf
               
           
         ; saves the numbers of the vertices whose normalcoords have to be changed after updatenormals
         If x = 1
            vertstobechanged[i]=vertex[0]
            i = i + 1
            vertstobechanged[i]=vertex[1]
            i = i + 1
         ElseIf z = 1
            vertstobechanged[i]=vertex[0]
            i = i + 1
            vertstobechanged[i]=vertex[3]
            i = i + 1
         ElseIf x = w\width-2
            vertstobechanged[i]=vertex[2]
            i = i + 1
            vertstobechanged[i]=vertex[3]
            i = i + 1
         ElseIf z=w\depth-2
            vertstobechanged[i]=vertex[1]
            i = i + 1
            vertstobechanged[i]=vertex[2]
            i = i + 1
         EndIf
      Next
   Next
   
   UpdateNormals(w\mesh)
   
   ; change some normalcoords to hide the tiling
   For i = 0 To 124*2
      VertexNormal w\sur,vertstobechanged[i],0,1,0
   Next
   
   BrushTexture w\brush,w\tex
   BrushTexture w\brush,w\tex2,Int(w\anim),2
   PaintSurface w\sur,w\brush
   
   w\anim = (w\anim + .5) Mod 23
   
   For s.wat_surf = Each wat_surf
      If s\w = w
         HideEntity s\piv
      EndIf
   Next
   
   ; render the cubemap texture
   Wat_UpdateCubemap(w\tex,w\cam,wat_gamecam)
   
   For s.wat_surf = Each wat_surf
      If s\w = w
         ShowEntity s\piv
      EndIf
   Next
   
End Function


Function Wat_UpdateCubemap(tex,camera,entity) ; this function isnt by me. dont know who wrote it
   SetBuffer BackBuffer()            ; nevertheless, thx to him for preventing me from havin' to write it on my own ^^
   tex_sz=TextureWidth(tex)
   ShowEntity camera
   HideEntity entity
   PositionEntity camera,EntityX#(entity,1),-EntityY(entity,1),EntityZ#(entity,1),1
   CameraViewport camera,0,0,tex_sz,tex_sz

   SetCubeFace tex,0
   RotateEntity camera,0,90,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)
   

   SetCubeFace tex,1
   RotateEntity camera,0,0,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

   SetCubeFace tex,2
   RotateEntity camera,0,-90,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

   SetCubeFace tex,3
   RotateEntity camera,0,180,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

   SetCubeFace tex,4
   RotateEntity camera,-90,0,0
   RenderWorld
   CopyRect 0,0,tex_sz,tex_sz,0,0,BackBuffer(),TextureBuffer(tex)

   ShowEntity entity
   HideEntity camera
End Function

Midimaster

BeitragMi, Jun 09, 2010 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Collisions werden nur beim Erreichen des Befehls UpdateWorld() kontrolliert. Der fehlt in deinem Code komplett und gehört in die Hauptschleife.
 

Pro Soft

Betreff: Fehler behoben!

BeitragMi, Jun 09, 2010 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank Midimaster Wink
Jetzt funktioniert alles ! Very Happy

mfg

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group