collision zwischen bewegenden Körpern

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

FreizeitCoder

Betreff: collision zwischen bewegenden Körpern

BeitragMi, Aug 26, 2009 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

meine Frage war garantiert schon einmal dran, allerdings ergibt die Suche "Blitz3d" und "collision" knapp 500 Ergebnise, weshalb ich so dreist bin den 501 Eintrag zu starten. Wink

Es geht um ein Kugellabyrinth im Stil der Holzkugellabyrinthe welche vor zwei Jahrzehnt in jedem Kinderzimmer standen. Alle die sich gerade frage "oh gott, so lange ist das schon her!?!"... wissen bestimmt wovon ich rede. Mit einem Rädchen links und einem rechts konnte man die Neigung der Labyrinthplattform verändern, und mußte damit die Kugel in dem Labyrinth ans Ziel befördern.

Mir macht die Problematik zwei sich bewegender Kollisionsobjekte zu schaffen. Blitz hat Probleme damit, und lässt die Kugel nach ein paar Steuerbewegungen durch die Labyrinthmauer rollen. Für den Boden habe ich eine handgeschriebene Sperre verwendet, aber für ein Labyrinth was in jedem Level unterschiedlich ist, ist das unmöglich!

Wie kann ich es mit möglichst wenig Aufwand gestallten, daß die Kugel die Mauern korrekt als Hindernis erkennt?
Meine Labyrinthplattform wird im gesammten, als Mesh gebaut und eingelesen.

Gruß

Xaymar

ehemals "Cgamer"

BeitragMi, Aug 26, 2009 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Kugel-Wand Kollision auf 2D ebene übertragen. Da es ja nur ein Level gibt(denke Ich mal) sollte das ganz einfach gehen.
Warbseite

faeX

BeitragMi, Aug 26, 2009 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Viertelstunde hingesetzt und folgendes zusammengetippt:

BlitzBasic: [AUSKLAPPEN]
; Kugeldemo von faeX

Type TKugel

Field X#, Y#
Field LastX#, LastY#
Field Radius#

End Type

Graphics 800, 600, 32, 1

Kugel.TKugel = New TKugel

Kugel\X = GraphicsWidth()/2
Kugel\Y = GraphicsHeight()/2

Kugel\LastX = Kugel\X
Kugel\LastY = Kugel\Y

Kugel\Radius = 40

Global hndControlledKugel% = Handle(Kugel)

For i = 1 To 15

Kugel.TKugel = New TKugel
Kugel\X = Rnd(0, GraphicsWidth())
Kugel\Y = Rnd(0, GraphicsHeight())

Kugel\LastX = Kugel\X
Kugel\LastY = Kugel\Y

Kugel\Radius = Rnd(10, 30)

Next

SetBuffer BackBuffer()

While Not KeyHit(1)

ControlKugel(hndControlledKugel)
UpdateKugeln()


If KeyHit(57) Then ApplyImpulse()

For K1.TKugel = Each TKugel

For K2.TKugel = Each TKugel

If Not (Handle(K1) = Handle(K2)) Then

UpdateCollision(K1, K2)

EndIf

Next

Next

DrawKugeln(hndControlledKugel)
Flip
Cls

Wend

Function UpdateKugeln()

For Kugel.TKugel = Each TKugel

XVec# = Kugel\X - Kugel\LastX
YVec# = Kugel\Y - Kugel\LastY

Kugel\LastX = Kugel\X
Kugel\LastY = Kugel\Y

; Geschwindigkeitsverarbeitung
XVec = XVec*.99
YVec = YVec*.99

Kugel\X = Kugel\X + XVec
Kugel\Y = Kugel\Y + YVec

If Kugel\X < 0 Then Kugel\X = 0
If Kugel\X > GraphicsWidth() Then Kugel\X = GraphicsWidth()

If Kugel\Y < 0 Then Kugel\Y = 0
If Kugel\Y > GraphicsHeight() Then Kugel\Y = GraphicsHeight()

Next

End Function

Function ControlKugel(hndKugel%)

Kugel.TKugel = Object.TKugel(hndKugel)
Kugel\X = Kugel\X + .2*(KeyDown(205) - KeyDown(203))
Kugel\Y = Kugel\Y + .2*(KeyDown(208) - KeyDown(200))

End Function

Function DrawKugeln(hndKugel%)

For Kugel.TKugel = Each TKugel

If Handle(Kugel) = hndKugel Then

Color 255, 0, 0

Else

Color 255, 255, 255

EndIf

Oval Kugel\X - Kugel\Radius, Kugel\Y - Kugel\Radius, Kugel\Radius*2, Kugel\Radius*2

Next

End Function

Function ApplyImpulse()

For Kugel.TKugel = Each TKugel

Kugel\X = Kugel\X + Rnd(-10, 10)
Kugel\Y = Kugel\Y + Rnd(-10, 10)

Next

End Function

Function UpdateCollision(K1.TKugel, K2.TKugel)

XVec# = K2\X - K1\X ; Vektorrechnung
YVec# = K2\Y - K1\Y
Dist# = Sqr(XVec*XVec + YVec*YVec) ; Entfernung
If (Dist <= (K1\Radius + K2\Radius)) Then

DeltaX# = K2\X - K1\X
DeltaY# = K2\Y - K1\Y

DeltaLength# = Sqr(DeltaX*DeltaX + DeltaY*DeltaY)
Difference# = ((K1\Radius + K2\Radius) - DeltaLength)/DeltaLength

K1\X = K1\X - DeltaX*Difference/2
K1\Y = K1\Y - DeltaY*Difference/2
K2\X = K2\X + DeltaX*Difference/2
K2\Y = K2\Y + DeltaY*Difference/2

EndIf

End Function


Sollte alles erklären Wink Natürlich auch auf 3D übertragbar Smile

Mfg faeX

[EDIT] Wer sich den Code durchliest, sollte feststellen, dass man mit Leertaste und den Cursortasten was ordentliches bewirken kann Wink

Noobody

BeitragDo, Aug 27, 2009 6:55
Antworten mit Zitat
Benutzer-Profile anzeigen
faeX hat Folgendes geschrieben:
Viertelstunde hingesetzt und folgendes zusammengetippt

Erkenne ich da Verletintegration? Wink

Zum Topic: Das ist zum Glück relativ einfach zu beheben.
Zuerst das Spielbrett bewegen (oder halt drehen, in diesem Fall), UpdateWorld ausführen, Kugel bewegen und wieder UpdateWorld ausführen; das sollte funktionieren.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Silver_Knee

BeitragDo, Aug 27, 2009 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
würde ich nicht machen... in dem fall blockiert die Kugel das spielfeld..
Ich würde:

kugel als child des spielfelds, nur kollision kugel->spielfeld

Spielfeld drehen
Updateworld

Kugel runter
Updateworld

So blockiert die kugel das spielfeld nicht und du kannst durch die drehung die kugel "mitnehmen"
 

FreizeitCoder

BeitragDo, Aug 27, 2009 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Prima. Hat funktioniert.

Ich muß jetzt zwar jeden Kollisionsteilnehmer über einen eigenen pivot drehen, aber die Kollision funktioniert dadurch 1A. Danke für den Tip Nobody. Das wird mir noch bei vielen Projekten hilfreich sein Wink

Gruß

Edit: Zu langsam geschrieben Wink
@Silver_Knee: Gute Idee. Bisher habe ich Kugel und Spielfeld über je einen parent-pivot gedreht. Deshalb habe ich wohl auch keine Schwierigkeiten beim drehen. Ich könnte natürlich auch die Kugel gleich zum Child des Spielfeldes machen. Damit werde ich noch ein wenig rumprobieren.

Danke euch.
Gruß

faeX

BeitragDo, Aug 27, 2009 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Erkenne ich da Verletintegration? Wink


Verlet Arrow Skateprojekt Arrow Kugeln

Alles in allem hat's trotzdem 'ne Viertelstunde gedauert Very Happy
 

FreizeitCoder

BeitragDo, Aug 27, 2009 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Arbeit die Du dir gemacht hast. Ist eine wahnsinns Leistung für 15min, allerdings komplizierter als ich es gebrauchen kann Wink

Gruß

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group