3d Terrain

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Schoasch

Betreff: 3d Terrain

BeitragMo, Feb 02, 2009 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute ich bins mal wieder.
Ich habe gestern im Chat schon ein paar Hinweise bekommen wie ich das Problem mit dem Terrain, dass ich auf dem Terrain gehen kann, lösen kann. Es hat auch prima geklappt ich habe eine Heighmap geladen und
mit TerrainY die Höhe abgefragt. Nun gibt es ein großes Problem.
Wenn das Terrain nun mit einem Terrain Editor oder z.B. auch Blender erstellt wird, und darauf Objekte platziert werden, kann das ganze ja nicht als Heighmap abgespeichert werden, das heißt ich kann auch TerrainY nicht mehr benutzen.
Welche möglichkeiten gäbe es da?

Danke schonmal im Vorraus,
mfg
Schoasch

The_Nici

BeitragMo, Feb 02, 2009 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Collisions
EntityCollided
EntityRadius
EntityType
TranslateEntity

Ein paar Befehle die dir nützlich sein könnten. Wink
Tipp: Bewege den Player nach unten.
 

Schoasch

BeitragMo, Feb 02, 2009 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für deine schnelle Antwort!
Also ich habe das ganze mal Versucht und die Kollision funktioniert auch schon:

Code: [AUSKLAPPEN]

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

;;;LoadTerrain
Global terrain = LoadMesh("gfx\Test_terrain.3ds")
PositionEntity terrain,0,0,0
ScaleEntity terrain,2,2,2
Global texture_grass = LoadTexture("gfx\Grass.png")
EntityTexture terrain,texture_grass,0,2
RotateEntity terrain,-90,0,0
EntityType terrain,2

;;;Camera
Global cam = CreateCamera()
PositionEntity cam,0,0,0
CameraRange cam,1,100000
EntityType cam,1

Repeat

   RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0
   If KeyDown(17) Then MoveEntity cam,0,0,1
   If KeyDown(31) Then MoveEntity cam,0,0,-1
   If col = 0 Then TranslateEntity cam,0,-1,0
   Collisions 1,2,2,2
   col = EntityCollided(cam,2)
   
   If KeyHit(57) Then jump = 1
   If jump = 1 Then
      zaehler = zaehler + 1
      MoveEntity cam,0,2,0
      If zaehler > 15 Then
         jump = 0
         zaehler = 0
      EndIf
   EndIf
      
MoveMouse 400,300
Flip
UpdateWorld
RenderWorld
Until KeyHit(1)


So zwei Probleme gibts jetzt noch.
Wie kann ich jetzt die Camera nicht am Boden picken lassen sondern sie um 10 Einheiten nach oben verschieben? z.b. MoveEntity cam,0,10,0 - nur halt dass es da springen würde, was uns auch schon zum zweiten Problem bringt.
Wenn ich mit der Camera richtung Himmel schaue und nach vorne gehe, dann hüpft die Kamera ganz wild auf und ab (weil sie ja normalerweise nach oben will aber durch TranslateEntity unten gehalten wird)

Und wird das bei guten Spielen wirklich auch so gemacht?
Gibt es da keine andere Lösung denn in dieser Art ala TerrainY?

Danke schonmal im Vorraus,
mfg
Schoasch

Blackside

BeitragMo, Feb 02, 2009 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstelle einfach ein kleinen Cube, und setze es als Parent von der Kamera. Dann kannst du die Kamera um ein paar Units Hochmachen(per Moveentity), damit es "menschlicher" aussieht und du nicht wie eine Ratte am Boden krabbelst Wink. Natürlich musst du dann die Kollision und Gravitation anstelle bei der Kamera, bei den Cube machen.
Dann kannst du auch das andere Problem lösen, indem du nur die Kamera hoch und runter drehst, und den Cube nur nach links und rechts drehst(dann wird die Kamera, weil sie ja ein Parent von den Cube ist automatisch mit nach links und rechts gedreht). Und bewegen tust du dann auch den Würfel mit Moveentity anstatt der Kamera.
Hier sollte eigentlich eine Signatur stehen!
 

Schoasch

BeitragMo, Feb 02, 2009 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, funktioniert =)
Was mir gerade aufgefallen ist, wenn ich das ganze im Vollbildmodus starte, kann ich mich nicht mehr vernünftig umschaun.
Wenn man sich drehen will, kommt es einem so vor als wäre es nur ein halber Frame pro Sekunde oder noch weniger aber wenn man nach vorne geht ist alles flüssig.
Es hilft nichts wenn ich Flip 0 mache oder das FPS-Limit ganz hoch stelle.
Die FPS gehen bei mir sogar bis zu 2500 rauf.
Hier nochmal der derzeitige Code:
Code: [AUSKLAPPEN]

Graphics3D 800,600,32,1
SetBuffer BackBuffer()
AppTitle "Engine"

;;;Globals
Global jump,zaehler,A1,A2,A3,FPS_C,FPS,ms

;;;LoadTerrain
Global terrain = LoadMesh("gfx\Test_terrain.3ds")
PositionEntity terrain,0,0,0
ScaleEntity terrain,2,2,2
Global texture_grass = LoadTexture("gfx\Grass.png")
ScaleTexture texture_grass,0.5,0.5
EntityTexture terrain,texture_grass,0,2
RotateEntity terrain,-90,0,0
EntityType terrain,2

;;;Camera
Global cam = CreateCamera()
PositionEntity cam,0,10,0
CameraRange cam,1,100000

;;;CameraParent
Global camparent = CreateCube()
PositionEntity camparent,0,0,1
EntityParent cam,camparent,1
EntityType camparent,1

;;;Light
Light1 = CreateLight()
PointEntity Light1,terrain

;;;Timer
Global FPS_timer = CreateTimer (60)

;;;Skybox


;;;Loop
Repeat
   UpdatePlayer()
   GetFPS()


MoveMouse 400,300
Flip
UpdateWorld()
RenderWorld()
Until KeyHit(1)




Function UpdatePlayer()
   ;;;Rotate and Move
      RotateEntity camparent,0,EntityYaw(camparent)-MouseXSpeed(),0
      RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam),0
         If KeyDown(17) Then MoveEntity camparent,0,0,1
         If KeyDown(31) Then MoveEntity camparent,0,0,-1
      Collisions 1,2,2,2
      col = EntityCollided(camparent,2)
      TranslateEntity camparent,0,-2,0 ;Schwerkraft
   
   ;;;Jump
      If KeyHit(57) And col > 0 Then jump = 1
      If jump = 1 Then
         zaehler = zaehler + 1
         MoveEntity camparent,0,3,0
         If zaehler > 20 Then
            jump = 0
            zaehler = 0
         EndIf
      EndIf
End Function


Function GetFPS()
WaitTimer(Fps_Timer)
FPS_C = FPS_C + 1
If ms<MilliSecs() Then
   ms = MilliSecs() + 1000
   FPS = FPS_C
   FPS_C = 0
EndIf
Text 0,0,"FPS: " + FPS
End Function


Jemand ne Ahnung woran das liegt?
Hab das vorige Programm mit der Heighmap auch getestet, da ist genau das selbe Question Question
Weis vlt. jemand woran das liegen könnte?
Danke schon mal im Vorraus
mfg
Schoasch

Edit:
Keine Ahnung warum, aber ich habe diese beide Befehle :
RotateEntity camparent,0,EntityYaw(camparent)-MouseXSpeed(),0
RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam),0

in eine eigene Funktion gegeben und jetzt funktionierts.... Komisch

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group