Mesh in Terrain

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

@dllfreak2001

Cooooooooooooooooooooooool!
Danke für den Tip! das bringt mich bei meinem eigenem Spiel weiter! :allright: :allright: :allright:
BildBildBildBild
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Übrigens das ding ist nen Mix aus Terrain und Mesh-Beispiel.

ein einfacher Ballershooter dürfte drin sein.

Für die Physikklamotte von PB und 3D-Schatten muss das Terrain aber ein normales mesh sein. Das heißt es muß dann für das Terrain ein Extramesh produziert werden.
Nur die Schatten sehen noch arg häßlich aus (viele Grafikfehler und ich verstehe nicht warum sie nicht bei einem terrain funzen wäre doch nicht so schwer). Und die Physik kannst du in die tonne werfen denn außer umkippen kannst du mit der zurzeit nix machen. Die Kollision funzt nur mit anderen entitys aber fürs terrain haste terrainheight() von daher sollten lustige ballerspiele möglich sein.
I´a dllfreak2001
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

IRRTUM!

Schatten funzen doch mit dem normalen Terrain :)
Aber nur der modulated typ.

Hier habe mal rumgespielt:
Jetzt hat man ne 3rd-person view mit WSAD steuert man.

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Terrain
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 5

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  Add3DArchive("Data\"          , #PB_3DArchive_FileSystem)
  Add3DArchive("Data\Skybox.zip", #PB_3DArchive_Zip)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    LoadMesh   (0, "Robot.mesh");-Mesh laden
    
    
    
    CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg"))
    AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1)
    CreateMaterial(2, LoadTexture(2, "r2skin.jpg")) ;-Material für Entity erstellen
    
    CreateTerrain("Terrain.png", MaterialID(0), 1, 1, 1, 4)
    
    CreateEntity(1, MeshID(0), MaterialID(2), 100,100,100) ;-Entity erstellen
    
    
    
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, 128, 25, 128)
    
    SkyDome("Clouds.jpg",5)
    CreateLight(0,RGB(200,100,150),0,200,0)
    AmbientColor(RGB(177,180,177))
    WorldShadows(#PB_Shadow_Modulative)
    
   
    
    ScaleEntity(1,0.1,0.1,0.1)
    ;-Entity X und Z position
    Global botx.f, botz.f
    botx = 300
    botz = 300
    
    Repeat
      Screen3DEvents()
            
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf
        ;-Entity bewegen
        
        
        If KeyboardPushed(#PB_Key_A)
          rot + 1
          RotateEntity(1,rot,0,0)
          
          
          RotateCamera(0, 1 , 0, RollZ)
          
        ElseIf KeyboardPushed(#PB_Key_D)
          rot - 1
          RotateEntity(1,rot,0,0)
          RotateCamera(0, -1 , 0, RollZ)
        EndIf
        
        
        
        If KeyboardPushed(#PB_Key_W)
          
          
          
          
          botx = botx + Cos(2*#PI*(rot/360))*0.1
          botz = botz - Sin(2*#PI*(rot/360))*0.1
          anim = 1
        ElseIf KeyboardPushed(#PB_Key_S)
          
        
        
        Else 
          anim = 0  
        EndIf

      EndIf

      


      If anim = 1
        If funk = 0 
        funk = 1
        AnimateEntity(1, "Walk")
        EndIf
        
      Else
        If funka = 0 
        funka = 1
        AnimateEntity(1, "Idle")
        EndIf
      
      EndIf
      If anim = 0 And funk = 1
      funk = 0
      EndIf
      
      If anim = 1 And funka = 1
      
     funka = 0
     EndIf
     
   


      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
      EndIf
      
      ;Height.f = TerrainHeight(CameraX(0), CameraZ(0))
      
      RotateCamera(0, MouseX  , MouseY, RollZ)
      ;MoveCamera  (0, KeyX, -CameraY(0)+Height+8, KeyY)
      
      CameraLocate  (0, botx - Cos(2*#PI*(rot/360))*15, TerrainHeight(botx,botz)+10, botz + Sin(2*#PI*(rot/360))*15)
      EntityLocate(1,botx,TerrainHeight(botx,botz),botz);-Entityposition festlegen  
      

      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End
I´a dllfreak2001
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Hallo Leute,

hab den Code nochmal ein bisschen erweitert.
Die Kamera lässt sich jetzt frei um das Mesh drehen, wenn man die rechte Maustaste gedrückt hält.

1. Kann man die Höhe eines Entitys ermitteln (eventuell sogar direkt aus dem Speicher lesen)? Da so eine Rotation ja um den Kopf des Spielers stattfinden sollte.

2. Falls einer nich animierte Mesh einbauen will möchte ich noch ein bisschen Werbung für meinen Konverter machen.
Guckst du hier:
http://www.purebasic.fr/german/viewtopic.php?t=12388

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Terrain
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#CameraSpeed = 5

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY


; die folgenden beiden Proceduren rechnen einen Winkel vom Bogenmaß ins Gradmaß um
Procedure.f GSin(winkel.f)
  ProcedureReturn Sin(winkel*#PI/180)
EndProcedure

Procedure.f GCos(winkel.f)
  ProcedureReturn Cos(winkel*#PI/180)
EndProcedure


If InitEngine3D()
  Add3DArchive("Data\"          , #PB_3DArchive_FileSystem)
  Add3DArchive("Data\Skybox.zip", #PB_3DArchive_Zip)
 
  InitSprite()
  InitKeyboard()
  InitMouse()
 
  If Screen3DRequester()
    LoadMesh   (0, "Robot.mesh");-Mesh laden
   
   
   
    CreateMaterial  (0, LoadTexture(0, "Terrain_Texture.jpg"))
    AddMaterialLayer(0, LoadTexture(1, "Terrain_Detail.jpg"), 1)
    CreateMaterial(2, LoadTexture(2, "r2skin.jpg")) ;-Material für Entity erstellen
   
    CreateTerrain("Terrain.png", MaterialID(0), 1, 1, 1, 4)
   
    CreateEntity(1, MeshID(0), MaterialID(2), 100,100,100) ;-Entity erstellen
   
   
   
    CreateCamera(0, 0, 0, 100, 100)
    CameraLocate(0, 128, 25, 128)
   
    SkyDome("Clouds.jpg",5)
    CreateLight(0,RGB(200,100,150),0,200,0)
    AmbientColor(RGB(177,180,177))
    WorldShadows(#PB_Shadow_Modulative)
   
   
   
    ScaleEntity(1,0.1,0.1,0.1)
    ;-Entity X und Z position
    Global botx.f, botz.f
    botx = 300
    botz = 300
    ; Distanz der Camera zum Entity kann mit Mausrad verändert werden
    ; Mindestwert
    MinCameraDistance = 5
    ; Maximalwert
    MaxCameraDistance = 50
    ; Standardeinstellung
    CameraDistance = 20
    ; Hier noch ein Paar optionen für die Camera Rotation
    ; AngleX ist waagerecht (bei 360 kann der Spieler sich komplett um das Mesh drehen)
    MaxCameraAngleX = 360
    MinCameraAngleX = 0
    ; AngleY ist senkrecht und als Sollwert definiert, die wahre Höhe wird an das Terrain angepasst
    MaxCameraAngleY = 80
    MinCameraAngleY = -20
    ; Mindesthöhe der Camera
    MinCameraHeight = 5
    
    
    Repeat
      Screen3DEvents()
           
      If ExamineKeyboard()
       
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed
        Else
          KeyX = 0
        EndIf
                 
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed
        Else
          KeyY = 0
        EndIf
        ;-Entity bewegen
       
       
        If KeyboardPushed(#PB_Key_A)
          rot + 1
          RotateEntity(1,rot,0,0)
         
         
          RotateCamera(0, 1 , 0, RollZ)
         
        ElseIf KeyboardPushed(#PB_Key_D)
          rot - 1
          RotateEntity(1,rot,0,0)
          RotateCamera(0, -1 , 0, RollZ)
        EndIf
       
       
       
        If KeyboardPushed(#PB_Key_W)
         
         
         
         
          botx = botx + Cos(2*#PI*(rot/360))*0.1
          botz = botz - Sin(2*#PI*(rot/360))*0.1
          anim = 1
        ElseIf KeyboardPushed(#PB_Key_S)
         
       
       
        Else
          anim = 0 
        EndIf
        
        boty = TerrainHeight(botx,botz)+7
        
      EndIf

     


      If anim = 1
        If funk = 0
        funk = 1
        AnimateEntity(1, "Walk")
        EndIf
       
      Else
        If funka = 0
        funka = 1
        AnimateEntity(1, "Idle")
        EndIf
     
      EndIf
      If anim = 0 And funk = 1
      funk = 0
      EndIf
     
      If anim = 1 And funka = 1
     
     funka = 0
     EndIf
     
   


      If ExamineMouse()
        MouseX = -(MouseDeltaX()/10)*#CameraSpeed/2
        MouseY = -(MouseDeltaY()/10)*#CameraSpeed/2
        ; diese Werte benutze ich für die Bewegung der Camera
        MouseDeltaX = MouseDeltaX()
        MouseDeltaY = MouseDeltaY()
        
        If MouseWheel()
          CameraDistance-MouseWheel()*#CameraSpeed/4
          If CameraDistance < MinCameraDistance
            CameraDistance = MinCameraDistance
          ElseIf CameraDistance > MaxCameraDistance
            CameraDistance = MaxCameraDistance
          EndIf
        EndIf
        
        If MouseButton(2)
          CameraAngleX+MouseDeltaX
          CameraAngleY+MouseDeltaY
        EndIf
      EndIf
     
      ;Height.f = TerrainHeight(CameraX(0), CameraZ(0))
     
      ;RotateCamera(0, MouseX  , MouseY, RollZ)
      ;MoveCamera  (0, KeyX, -CameraY(0)+Height+8, KeyY)
      
      ;CameraLocate  (0, botx - Cos(2*#PI*(rot/360))*15, TerrainHeight(botx,botz)+10, botz + Sin(2*#PI*(rot/360))*15)
      If CameraAngleX > MaxCameraAngleX : CameraAngleX-360 : ElseIf CameraAngleX < 0 : CameraAngleX+360 : EndIf
      If CameraAngleY > MaxCameraAngleY
        CameraAngleY = MaxCameraAngleY
      ElseIf CameraAngleY < MinCameraAngleY
        CameraAngleY = MinCameraAngleY
      EndIf
      CameraLocate(0, GSin(CameraAngleX)*CameraDistance+botx, GSin(CameraAngleY)*CameraDistance+boty, GCos(CameraAngleX)*CameraDistance+botz)
      If CameraY(0) < TerrainHeight(CameraX(0), CameraZ(0))+MinCameraHeight
        CameraLocate(0, CameraX(0), TerrainHeight(CameraX(0), CameraZ(0))+MinCameraHeight, CameraZ(0))
      EndIf
      CameraLookAt  (0, botx, boty, botz)
      EntityLocate(1,botx,boty-7,botz);-Entityposition festlegen 
     

      RenderWorld()
      Screen3DStats()
      StartDrawing(ScreenOutput())
        DrawingMode(1)
        FrontColor(#White)
        DrawText(10, 10, "CameraX: "+StrF(CameraX(0), 3))
        DrawText(10, 30, "CameraY: "+StrF(CameraY(0), 3))
        DrawText(10, 50, "CameraAngleX: "+Str(CameraAngleX))
        DrawText(10, 70, "CameraAngleY: "+Str(CameraAngleY))
        DrawText(10, 90, "CameraDistance: "+Str(CameraDistance))
      StopDrawing()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
   
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
 
End
Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Antworten