Collisions bei animiertem Mesh

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

joshmami

Betreff: Collisions bei animiertem Mesh

BeitragMi, Sep 07, 2011 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community,
Ich möchte gerne ein animiertes Mesh auf Kollision mit einem anderen abfragen.Nur funktioniert der Befehl Kollisions nicht.Ich habe schon alle drei Abfrage-Möglichkeiten (Kugel-Kugel;Kugel-Polygon;Kugel-Würfel) ausprobiert, aber bei jeden Versuch gingen die Entities "durcheinander hindurch".
Der Code von dem Versuch mit Kugel-Kugel:
BlitzBasic: [AUSKLAPPEN]
EntityType Gegner,1,1
EntityType Player,2,1
EntityRadius Gegner,5,5
EntityRadius Player,5,5
Collisions 2,1,1,1


Der Code von dem Versuch mit Kugel-Polygon:
BlitzBasic: [AUSKLAPPEN]

EntityType Gegner,1,1
EntityType Player,2,1
Collisions 2,1,2,1


Der Code von dem Versuch mit Kugel-Würfel:
BlitzBasic: [AUSKLAPPEN]

EntityType Gegner,1,1
EntityType Player,2,1
EntityBox Gegner,EntityX(Gegner),EntityY(Gegner),EntityZ(Gegner),5,5,5
EntityBox Player,EntityX(Player),EntityY(Player),EntityZ(Player),5,5,5
Collisions 2,1,3,1


Jetzt hoffe ich, ihr könnt mir helfen

ToeB

BeitragMi, Sep 07, 2011 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich tippe mal darauf das du beide Entity bewegst. Die Kollision von Blitz3D geht aber nur, wenn das Entity B statisch ist (sich also nicht bewegt). Wenn du allerdings eine Spieler-Spieler Kollision brauchst, musst du entweder auf eine externe Physik-Simulation zurückgreifen, oder dir einfach die Radius-Abfragen selber schreibst (Abstand berechen und winkel beider Spieler berechnen, prüfen ob der Wert kleiner ist als die Radien der Kollisions-Kugeln und dann zurücksetzten) Wink

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

joshmami

BeitragMi, Sep 07, 2011 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal Danke für die schnelle Antwort, ToeB Very Happy
Bei meinen Versuchen habe ich zwar nur einen der Spieler bewegt, aber beide wurden gerade animiert, also waren sie wahrscheinlich beide nicht statisch.Offenbar muss ich mir also selbst eine Abfrage schreiben Sad
Oder kennst du eine gute externe Physik-Simulation, die ich verwenden könnte?

Midimaster

BeitragMi, Sep 07, 2011 14:59
Antworten mit Zitat
Benutzer-Profile anzeigen
hast du denn wirklich ein UpdateWorld in der Hauptschleife?

@ToeB
das hör ich zum ersten Mal, dass nur eines der beiden Objekte bewegt werden darf. Stimmt das wirklich?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

joshmami

BeitragMi, Sep 07, 2011 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Natürlich, die Animationen funktionieren ja auch fehlerfrei

Xeres

Moderator

BeitragMi, Sep 07, 2011 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Jupp, wenn sich beide Objekte bewegen gibt es Probleme:

BlitzBasic: [AUSKLAPPEN]
Graphics3D 640, 480, 0, 2 
SetBuffer BackBuffer()
camera = CreateCamera()
RotateEntity camera, 45, 0, 0
PositionEntity camera, 0, 15, - 10
light = CreateLight()
RotateEntity light, 45, 0, 0

sphere1 = CreateSphere(32)
EntityColor(sphere1,0,200,0)
EntityType sphere1, 1
EntityRadius sphere1, 1
PositionEntity sphere1, +4, 5, 0

sphere2 = CreateSphere(32)
EntityColor(sphere2,0,0,200)
EntityType sphere2, 2
EntityRadius sphere2, 1
PositionEntity sphere2, -4, 5, 0


Collisions 1, 2, 2, 2
ResetEntity(sphere1)
ResetEntity(sphere2)

While Not KeyDown(1)

;* Eine Zeile auskommentieren zum vergleich:
MoveEntity sphere1, -0.01, 0, 0
MoveEntity sphere2, +0.01, 0, 0

UpdateWorld
RenderWorld
Flip
Wend
End
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

BeitragMi, Sep 07, 2011 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
wow! Danke Xeres!

ist das ein Bug, oder gibt es hierfür eine Erklärung?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

joshmami

BeitragMi, Sep 07, 2011 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Was ist denn eigentlich so eine Physik-Simulation, die die Lösung sein könnte?
Ist NooNooPhysiks so etwas?
Und müsste ich dafür alles umschreiben?

Xeres

Moderator

BeitragMi, Sep 07, 2011 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube, es liegt an der Reihenfolge der Aktionen: Erst wird bewegt und dann bei UpdateWorld Kollisionen verarbeitet. Dann lässt sich nicht entscheiden, welcher Mesh in welchen eingedrungen ist und entsprechend gestoppt werden muss.

@joshmami:
Physik-Simulation ist ein bisschen mit Kanonen auf Spatzen schießen. Da musst du dich einarbeiten und ja, ggf. andere Mechanismen in den Code bauen. Könntest du dann aber natürlich auch gleich für andere Sachen benutzen.
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)

Noobody

BeitragMi, Sep 07, 2011 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
@Midimaster: Nein, das ist in dem Sinne kein Bug, sondern einfach ein fehlendes Feature. Kollisionen von mehreren sich bewegenden Meshes zu berechnen ist irre kompliziert Razz

@joshmami: Oft wird in solchen Fällen auf eine Physikengine zurückgegriffen, um das Problem zu lösen. Es gibt zwar einige wenige Libraries, die sich nur auf Kollisionen spezialisieren, aber ich glaube nicht, dass Wrapper für B3D existieren. NooNooPhysics würde ich nicht empfehlen, da sie nur für 2D gedacht ist und schon lange keinen Support mehr erhält.

Allerdings muss man sehen, dass eine vereinfachte Kollision eigentlich der bessere Weg ist, als auf Polygon-Polygon Kollision zu beharren. Eine Kugel-Kugel Kollision für bewegte Objekte ist ja schnell geschrieben und sollte für die meisten Fälle eigentlich reichen.
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

Midimaster

BeitragMi, Sep 07, 2011 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres

auf die Idee bin ich auch gleich gekommen und habe mal 2 UpdateWorld() reingepackt. Aber leider kein Unterschied
BlitzBasic: [AUSKLAPPEN]
While Not KeyDown(1) 
MoveEntity sphere1, -0.01, 0, 0
UpdateWorld
MoveEntity sphere2, +0.01, 0, 0
UpdateWorld

RenderWorld
Flip
Wend



Es ist sogar so, dass man die Bewegung von Sphere1 abschalten kann und dann gibt es immer noch keine Kollision!

BlitzBasic: [AUSKLAPPEN]
While Not KeyDown(1) 
;MoveEntity sphere1, -0.01, 0, 0
MoveEntity sphere2, +0.01, 0, 0

UpdateWorld
RenderWorld
Flip
Wend


seltsam!!!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Xeres

Moderator

BeitragMi, Sep 07, 2011 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich nicht seltsam, da bei Collisions ein bewegtes und ein unbewegtes Objekt angegeben wird.
BlitzBasic: [AUSKLAPPEN]
Collisions 1, 2, 2, 2
Collisions 2, 1, 2, 2

...und schon klappt dein Code.

Edit: Stoppt aber auch ohne zusätzliches UpdateWorld, da beide Objekte angehalten werden. Oder so.

@joshmami: Collisions schon mal in beide Richtungen angeschaltet?
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)

joshmami

Betreff: Gelöst!!!

BeitragMi, Sep 07, 2011 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Juhuuu Very Happy Very Happy
Das ist die Lösung!
Vielen Dank an Xeres, und alle anderen die versucht haben, mir zu helfen Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group