Kollision mit bewegten Objekten (z.B. Plattformen und Lifte)

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

semtech

Betreff: Kollision mit bewegten Objekten (z.B. Plattformen und Lifte)

BeitragMi, Jul 12, 2006 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.

Ich möchte für eine Art Jump&Run bewegte Plattformen und Lifte machen, auf die der Spieler springen kann bzw. von denen er "weggeschoben" werden soll, wenn er mit ihnen kollidiert.
Leider funktioniert die Kollisionsabfrage nicht richtig, wenn sich das Objekt, mit dem kollidiert werden soll, bewegt.

Codebeispiel:

Code: [AUSKLAPPEN]
cam=CreateCamera()
PositionEntity(cam,0,0,-10)
EntityRadius(cam,2)
EntityType(cam,1)

light=CreateLight()

cube=CreateCube()
EntityType(cube,2)

Collisions(1,2,2,3)

While Not KeyDown(1)

   MoveEntity(cube,0,0,-0.1)
   
   UpdateWorld()
   RenderWorld()
   
   Flip()

Wend


Wie man sehen kann, bewegt sich der Cube einfach durch die Kamera (also den Spieler) hindurch.

Mir ist schon klar, dass es so einfach nicht funktioniert. Ich habe schon ein bisschen rumprobiert:
- Kollisionen des Objektes mit der Kamera gehen nicht, weil die Plattformen und Lifte kompliziertere Formen haben sollen als Boxen und Kugeln (z.B. eine Liftkabine, die nur vernünftig über sphere-to-polygon abgefragt werden kann)
- das Kamera-Objekt bei einer Kollision über EntityParent() an die Plattform/den Lift zu hängen, hat auch nicht gut geklappt, da es dann schwierig ist, zu erkennen, wann der Spieler wieder von der Plattform runterhüpft

Hat einer eine Idee oder ist selber schon auf das Problem gestoßen?
Vielen Dank!

Christoph

BeitragMi, Jul 12, 2006 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich habe solche Probleme auch öfters entdeckt, habe letztendlich aber herausgefunden woran es liegt.

1. Setze zuerst den Grafikmodus. ->ql:Graphics3D 800,600,32,2:ql:SetBuffer ql:BackBuffer() (ich glaube das hast du nur nicht mitkopiert Wink )
2. Lies das: ql:Collisions
3. Ich weiß nicht woran es liegt, aber bei mir klappt es nur wenn man den 3. Parameter von ql:Collisions auf 1 setzt.
4. Da bin ich mir ziemlich sicher:

ql:Collisions(1,2,2,3) hast du ja hoffentlich schon umgeändert in
ql:Collisions(1,2,1,3)

Schau dir den Befehl an. Würfel ist Type 2. Kamera ist Type 1. D.h. Die Camera
wird auf Kollision mit dem Würfel geprüft. Aber der Würfel kollidiert doch mit der Kamera (weil der sich ja bewegt). ->Keine Reaktion
Ich weiß nicht warum das so umständlich geregelt ist (im Grunde genommen kollidiert ja auch die Camera)!
->Setzte Collisions(1,2,1,3) auf Collisions(2,1,1,3)!

Hier der Code: (Ich habe die Kamera etwas nach rechts gesetzt damit man sieht das der Würfel schleift)
Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
cam=CreateCamera()
PositionEntity(cam,1,0,-10)
EntityRadius cam,5
EntityType cam,1

light=CreateLight()

cube=CreateCube()
EntityType(cube,2)

Collisions(2,1,1,3)

While Not KeyDown(1)

   MoveEntity(cube,0,0,-0.1)
   
   UpdateWorld()
   RenderWorld()
   
   Flip()

Wend
End

Rone

BeitragMi, Jul 12, 2006 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

dachte grad dass das ja wohl kein Problem sein kann?!
Aber irgendwie gfunktioniert kollision mit bewegten objekten bei mir auch nicht.

Habe dazu das collisions Beispiel aus der OnlineHilfe nen bisschen abgeändert:
Code: [AUSKLAPPEN]

Graphics3D 640,480,3
   SetBuffer BackBuffer()
   camera=CreateCamera()
   RotateEntity camera,45,0,0
   PositionEntity camera,0,15,-10
   light=CreateLight()
   RotateEntity light,45,0,0
   
   sphere=CreateSphere(32)
   EntityType sphere,1
   EntityRadius sphere,1
   PositionEntity sphere,0,11,0
   
   cube=CreateCube()
   EntityType cube,2
   EntityColor cube,0,100,0
   PositionEntity cube,0,-5,0
   ScaleEntity cube,10,10,10
   
   cube2=CreateCube()
   EntityType cube2,2
   EntityColor cube2,100,100,0
   PositionEntity cube2,4,7,0
   ScaleEntity cube2,2,0.2,2
   
   cylinder=CreateCylinder(32)
   EntityType cylinder,2
   EntityColor cylinder,255,0,0
   PositionEntity cylinder,0,7,0
   ScaleEntity cylinder,2,2,2
   
   Collisions 1,2,2,2
   
   Local rich=1
   
   While Not KeyDown(1)
      x#=0
      y#=0
      z#=0
   
      If KeyDown(203)=1 Then x#=-0.1
      If KeyDown(205)=1 Then x#=0.1
      If KeyDown(208)=1 Then z#=-0.1
      If KeyDown(200)=1 Then z#=0.1
      
      If rich<100 Then
         MoveEntity(cube2,0,0.1,0)
      ElseIf rich > 100 And rich < 206 Then
         MoveEntity(cube2,0,-0.1,0)
      ElseIf rich > 200
         rich=0
      EndIf
      rich=rich+1


      MoveEntity sphere,x#,-0.1,z#
      UpdateWorld
      RenderWorld

      Flip
   Wend
End


Bewegt sich der 2.Cube nicht, dann geht auch die Collision?!

Kann doch nicht sein...

mfg
 

Dreamora

BeitragMi, Jul 12, 2006 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie fehlen mir da dann doch einige der Kollisionsbefehle die beim Setup notwendig sind ...

http://www.blitzbase.de/menu/3h.htm
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rone

BeitragMi, Jul 12, 2006 15:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Irgendwie fehlen mir da dann doch einige der Kollisionsbefehle die beim Setup notwendig sind ...

http://www.blitzbase.de/menu/3h.htm


Bin ich blind oder was?! Kenn mich auch nicht wirklich mit B3D aus aber dachte dass es so gehen muss?!?!
Wenn du weisst welche Kollisionsbefehle beim Setup fehlen, könntest du die Fehlende Zeile bitte hinzufügen... Smile

Wie gesagt, wenn man den 2.Cube bewegt, geht die Kollision ja...
Nur wenn er sich bewegt nicht!

mfg
 

Dreamora

BeitragMi, Jul 12, 2006 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Du setzt kein EntityBox, kein EntityRadius

Es gibt nur diese beiden Typen von Kollision, box oder radius und deren werte musst du entsprechend setzen.

Dabei sollte ich aber hinzufügen, dass die Box sich nicht mitdreht, wenn du die Entity rotierst.

Der Polygonkollisionsmodus bringt dir im Falle von nicht statischen Objekten nichts.

Wenn du bessere Kollision brauchst mit physikalischer Reaktion musst du das entweder mit linepick selbst schreiben oder ein physik modul wie ODE / Newton nutzen bzw. Nuclear Glory Collision Library
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rone

BeitragMi, Jul 12, 2006 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Du setzt kein EntityBox, kein EntityRadius

Es gibt nur diese beiden Typen von Kollision, box oder radius und deren werte musst du entsprechend setzen.


Kollision funktioniert auch ohne Box/radius Confused Ich dachte das wäre nur dafür, wenn der Kollisionsbereich größer ist als das Objekt selbst?!

Zitat:
Wenn du bessere Kollision brauchst mit physikalischer Reaktion musst du das entweder mit linepick selbst schreiben oder ein physik modul wie ODE / Newton nutzen bzw. Nuclear Glory Collision Library

Um bessere Colli oder physik gehts ja gar nicht, sonder darum, dass sich das Objekt mitbewegt, wenn es z.B. auf einem "fahrstuhl" ist....
Oder geht das nicht und man musss ein Objekt wenn es sich mit dem "Fahrstuhl" mitbewegen soll, dem Fahrstuhl als Parent anfügen?

Konkret: Was ist an dem von mir geposteten Code Falsch? Nach meiner Logik müsste sich die Kugel mit der Plattform mitbewegen, wenn sie da drauf ist...

mfg
Rone
 

semtech

BeitragMi, Jul 12, 2006 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Zunächst mal vielen Dank. Ich kenne kein anderes Forum, wo man zu speziellen Fragen so schnell so viele brauchbare Antworten kriegt!

Bei der Kollision mit sphere-to-sphere klappt es durchaus, selbst wenn das Objekt bewegt ist. Für meinen Fall brauche ich aber sphere-to-polygon, weil meine Lifte nun mal keine Kugeln sind. Die Kamera (also der Spieler) ist in dem Moment die sphere und die bewegten Objekte sollten als polygon abgefragt werden, da es sich ja z.B. um eine Fahrstuhlkabine handelt.

Daher habe ich nur der Kamera einen EntityRadius verpasst, der cube braucht das nicht. Dieses Verfahren klappt auch toll bei nicht-bewegten Objekten (z.B. Fußböden, Wände, Treppen usw.).

Den Aufzug z.B. als Parent der Kamera zu nehmen, geht erstmal wunderbar, aber wie definiere ich, welche Plattform zu welchem Zeitpunkt parent werden soll (insbesondere wenn es mehrere gibt)? Das kann ich wiederum nur über Kollisionskontrolle herausfinden (und die tut's ja gerade nicht).

Ich denke, ich werde mal ein bisschen mit Linepick experimentieren. Das könnte gut gehen, da ich ja nur ein einziges Objekt (nämlich die Kamera) überprüfen muss. Die Aufzüge untereinander sollen ja nicht kollidieren.
MeshesIntersect bringt mir übrigens auch nichts, da die Kamera ja kein mesh ist.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group