kolision mit bodem (kamera)

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: kolision mit bodem (kamera)

BeitragSo, Apr 18, 2010 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
nochmal leider ein thema, habe nun versucht eine kolisionsabfrage einzubauen

aber irgendwie scheint es da schwirig zu werden, hier der code

Code: [AUSKLAPPEN]
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

camera = CreateCamera()
PositionEntity camera, 256, 10, 256
RotateEntity camera, 45, 0, 0

light = CreateLight()
RotateEntity light, 90, 0, 0


terrain = CreateTerrain(512)
EntityPickMode terrain , 2

drum = LoadMesh("haus_000.3ds")


grass_tex = LoadTexture("mossyground.bmp")
EntityTexture terrain,grass_tex



While Not KeyHit(1)
   Collisions  1, 2, 2, 2
   
   RenderWorld 

      mx = MouseX()
      my = MouseY()
      entity = CameraPick(camera, mx, my)

      RenderWorld
   
   If entity = 0 Then Text 0, 0, "Nicht ausgewählt"
      If entity<>0 Then
         Text 0, 0, "Ausgewählt:" + entity
       Text 0, 20, "X:" + PickedX()
       Text 0, 40, "Y:" + PickedY()
       Text 0, 60, "Z:" + PickedZ()
   
      If MouseDown(1) Then
         PositionEntity drum,PickedX(),.5,PickedZ()
       EndIf
   EndIf
      
   Oval mx - 5, my - 5, 10, 10, 1
   
   ;#########################################################################
   ;#                                                                       #
   ;#           Am Bildschirmrand die Maus Bewegen                          #
   ;#                                                                       #
   ;#########################################################################
   If MouseX()>-15 And MouseX()<1024 And MouseY()>-15 And MouseY()<15 Then MoveEntity camera, 0, +0.05, 0.05
   If MouseX()>-15 And MouseX()<1024 And MouseY()>768-15 And MouseY()<768 Then MoveEntity camera, 0, -0.05, -0.05
   
   If MouseX()>-15 And MouseX()<15 And MouseY()>-15 And MouseY()<768 Then MoveEntity camera,   -0.05,0,0
   If MouseX()>1024-15 And MouseX()<1024+15 And MouseY()>-15 And MouseY()<768 Then MoveEntity camera,   +0.05,0,0
   
   ;#########################################################################
   ;#                                                                       #
   ;#           Kamera hoch und runter                                       #
   ;#                                                                       #
   ;#########################################################################
   If KeyDown(200) = 1 Then MoveEntity camera, 0,.5, 0
   If KeyDown(208) = 1 Then MoveEntity camera, 0, -.5,0
   If KeyDown(205) = 1 Then TurnEntity  camera, 0, 1, 1
   If KeyDown(203) = 1 Then TurnEntity  camera, 0, -1, -1

   Flip
Wend
End


nun die frage warum geht dort keine kolisionsabfrage, also im grunde soll die kamera nicht durch den boden gehen beim heranzoomen. wie kann ich das machen?

Xeres

Moderator

BeitragSo, Apr 18, 2010 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Nummern bei Collisions (vor, nicht in die Schleife) sind unbekannt, wenn du sie nicht mit EntityType an Kamera und Boden vergibst.
Die Kamera braucht dann noch einen Kollisionsradius den du mit EntityRadius einstellst.

Warum 2x RenderWorld?
Warum benutzt du die Variablen mx & my nicht?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragMo, Apr 19, 2010 7:58
Antworten mit Zitat
Benutzer-Profile anzeigen
außerdem fehlt UpdateWorld(). Erst damit werden Kollisionen entdeckt.

BlitzBasic: [AUSKLAPPEN]
EntityType Camera,1
EntityType Terrain,2

Collisions 1, 2, 2, 2

While Not KeyHit(1)
; hier alle Änderungen
UpdateWorld
RenderWorld
Flip
Wend

Mathias-Kwiatkowski

BeitragMo, Apr 19, 2010 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh das sieht schon recht gut aus, nur was is wenn es objekte sind, also mit linker maustaste setz ich ein haus ab, dieses steht im type , aber man kann diese häuser wie in einem malprogramm dennoch "übermalen" welche möglichkeit habe ich das ein objekt nicht in einem anderen gesetzt wird?

hier nochmal der code den ich bislang habe. falls die 3ds dateien benötigt werden, bitte sagen.

Code: [AUSKLAPPEN]
Graphics3D 1024,768,32,1
Global objekt.objekt
Type objekt
   Field x#
   Field y#
   Field z#
   Field haus
End Type


SetBuffer BackBuffer()

camera = CreateCamera()
PositionEntity camera, 512/2, 10, 512/2
RotateEntity camera, 45, 0, 0
EntityType Camera,1

light = CreateLight()
RotateEntity light, 90, 0, 0


terrain = CreateTerrain(512)
EntityPickMode terrain , 2
EntityType Terrain,2

drum = LoadMesh("media\haus_000.3ds")
EntityPickMode drum , 2
EntityType  drum , 2
ScaleMesh drum,.2,.2,.2

grass_tex = LoadTexture("media\grass_bright.jpg")
EntityTexture terrain,grass_tex


Collisions  1, 2, 2, 2

While Not KeyHit(1)
   


   TerrainShading  terrain, 1
   TerrainDetail Terrain, 45000,1
   
      mx = MouseX()
      my = MouseY()
      entity = CameraPick(camera, mx, my)
   UpdateWorld
      RenderWorld
   
 
      
   Text 220, 0, "Linke Maustaste= Bauen"
   Text 220, 20, "Rechte Maustaste= Abreissen"    
   Text 220, 40, "Pfeiltaste Hoch & Runter"
   Text 220, 60, "Maus an den Rand bewegen"
   Text 220, 80, "Pfeiltasten Links & Rechts"


   If entity = 0 Then Text 0, 0, "Nicht ausgewählt"
      If entity<>0 Then
         Text 0, 0, "Ausgewählt:" + entity
       Text 0, 20, "X:" + PickedX()
       Text 0, 40, "Y:" + PickedY()
       Text 0, 60, "Z:" + PickedZ()
      
      Text 0, 100, "Benutze Cursortasten..."
         Text 0, 120, "X Position: " + EntityX#(camera)
        Text 0, 140, "Y Position: " + EntityY#(camera)
         Text 0, 160, "Z Position: " + EntityZ#(camera)
       
      anzahl=0      
      For objekt.objekt= Each objekt
         anzahl=anzahl+1
         
      Next
      
      Text 0, 200, "Anzahl: " + anzahl
      
      ;#########################################################################
      ;#                                                                       #
      ;#           Wenn man mit maustaste 2 draufklickt mesh löschen           #
      ;#                                                                       #
      ;#########################################################################
      For objekt.objekt= Each objekt
         
         If entity=objekt\haus Then
            EntityColor objekt\haus,0,255,0
            CameraProject  camera, EntityX(objekt\haus, 1), EntityY(objekt\haus, 1), EntityZ(objekt\haus, 1)
            Text ProjectedX(),ProjectedY(),"www" ;Das www soll übern haus angezeigt werden,

            If MouseHit(2) Then
               FreeEntity objekt\haus
               Delete objekt.objekt
            EndIf
            
         Else
            EntityColor objekt\haus,255,255,255
         EndIf
      Next
      
      ;#########################################################################
      ;#                                                                       #
      ;#           neues gebäude hinzufügen                                #
      ;#                                                                       #
      ;#########################################################################
      If MouseHit(1) Then
         objekt= New objekt
         objekt\x# = PickedX()
         objekt\y# = .5
         objekt\z# = PickedZ()
         objekt\haus= LoadMesh("haus_000.3ds")
         EntityPickMode objekt\haus, 2
         EntityType  objekt\haus, 2
         PositionEntity objekt\haus,PickedX(),.5,PickedZ()

       EndIf
   EndIf
      
   Oval mx - 5, my - 5, 10, 10, 1
   
   ;#########################################################################
   ;#                                                                       #
   ;#           Am Bildschirmrand die Maus Bewegen                          #
   ;#                                                                       #
   ;#########################################################################
   If MouseX()>-15 And MouseX()<1024 And MouseY()>-15 And MouseY()<15 Then MoveEntity camera, 0, +0.05, 0.05
   If MouseX()>-15 And MouseX()<1024 And MouseY()>768-15 And MouseY()<768 Then MoveEntity camera, 0, -0.05, -0.05
   
   If MouseX()>-15 And MouseX()<15 And MouseY()>-15 And MouseY()<768 Then MoveEntity camera,   -0.05,0,0
   If MouseX()>1024-15 And MouseX()<1024+15 And MouseY()>-15 And MouseY()<768 Then MoveEntity camera,   +0.05,0,0
   
   ;#########################################################################
   ;#                                                                       #
   ;#           Kamera hoch und runter                                       #
   ;#                                                                       #
   ;#########################################################################
   If KeyDown(200) = 1 Then MoveEntity camera, 0,.5, 0
   If KeyDown(208) = 1 Then MoveEntity camera, 0, -.5,0
   If KeyDown(203) = 1 Then TurnEntity  camera, 0, 1, 1
   If KeyDown(205) = 1 Then TurnEntity  camera, 0, -1, -1
   If EntityY(camera)<3 Then MoveEntity camera, 0,0.5, 0
   If EntityY(camera)>30 Then MoveEntity camera, 0,-0.5, 0

   If EntityX(camera)<0 Then MoveEntity camera, 0.05,0,0
   If EntityX(camera)>512 Then PositionEntity camera, 512, EntityY#(camera), EntityZ#(camera)
   
   If EntityZ(camera)<0 Then PositionEntity camera, EntityX#(camera), EntityY#(camera), 0
   If EntityZ(camera)>512 Then PositionEntity camera, EntityX#(camera), EntityY#(camera), 512

   FlushMouse()
   Flip
Wend
End

Jo0oker

BeitragMo, Apr 19, 2010 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich richtig verstehe was du uns sagen willst, dann versuch es am besten mit Pick-Befehlen und nicht mit Kollisionen.

Schau dier mal CameraPick, PickedX, PickedY und PickedZ an.

Du könntest die neuen Objekte dann anhand der Koordinaten von PickedXYZ einfach setzten.

Wenn du etwas anderes meinst, dann beschreib noch einmal genauer dein Problem.

Ach und es heißt Kollision mit Boden Wink

lg Jo0oker
Tehadon, das kostenlose 3D RPG
www.tehadon.de
http://www.blitzforum.de/worklogs/14/
Das Abenteuer wird beginnen!

Mathias-Kwiatkowski

BeitragMo, Apr 19, 2010 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
mein problem is doch ganz einfach, ich setz mit linker maustaste ein objekt, und kann in diesem objekt noch eins ablegen, und genau das sollte nicht passieren, ich dachte das würde mit collision gehen, tuts nur leider nicht

Jo0oker

BeitragMo, Apr 19, 2010 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso kannst du dieses Problem nicht mit Pick lösen?

Wenn du etwas nicht übermalen willst, kannst du ja zuvor überprüfen, ob da bereits ein Haus oder etwas ähnliches ist.

Dafür kannst du dir auch gleich den Befehl PickedEntity angucken..

lg Jo0oker
Tehadon, das kostenlose 3D RPG
www.tehadon.de
http://www.blitzforum.de/worklogs/14/
Das Abenteuer wird beginnen!

Mathias-Kwiatkowski

BeitragMo, Apr 19, 2010 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
also mit der funktion pic, -> EntityPickMode objekt\haus, 2,0 <- sollte er das übermalen ja vermeiden aber es passiert doch noch zumindest so ca 30 pixel

Midimaster

BeitragMo, Apr 19, 2010 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber du kannst doch unmittelbar nachdem das neue haus per maus gesetzt ist, dieses auf Collisionen testen lassen, und wenn da eine Kollision ist, dann verschiebst du das ding einfach noch solange, bis keine kollisionen mehr gemeldet werden.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group