3D: Kollision von Entity und Node?

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

3D: Kollision von Entity und Node?

Beitrag von TheCreepyProgramer »

Hallo,

da ich im Gebiet 3D noch relativ unerfahren bin, möchte ich von euch gerne wissen, ob es überhaupt möglich ist, mit EnableWorldCollisions() zu überprüfen, ob eine Node mit einem Entity kollidiert ist bzw. ob es ein gutes Beispiel dazu gibt. Aus dem vom Code-Archiv werde ich nämlich nicht schlau.

Markus
Bild
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: 3D: Kollision von Entity und Node?

Beitrag von Regenduft »

Nein, das geht nicht, da ein Node ja keinen Körper besitzt. Du musst Dir einen Node wie ein weiteres 3D-Kooridatensystem vorstellen, dass Du am Nullpunkt greifst und dann an einer beliebigen Stelle in der Welt (oder dem übergeordneten Node) positionierst. Ein Node ist also ein Punkt und kein Körper!

Falls Du das schon wusstest und nur überprüfen willst, ob der Node innerhalb des Entity-Körpers liegt, so geht das grundsätzlich auch nicht (glaube ich zumindest - bin auch nicht sooo erfahren im 3D-Bereich).

Allerdings kannst du mit EntityBoundingBox() den Begrenzungsrahmen ermitteln (siehe "Examples\3D\EntityBoundingBox.pb"). Dann musst Du nur abfragen, ob der Node innerhalb dieses Quaders liegt, was dann einer Kollision entspräche.

Alternativ kannst Du auch MeshRadius() nutzen. Dann musst Du nur den Abstand zwischen Node und Entity-Mittelpunkt ermitteln und wenn dieser Abstand kleiner als der Mesh-Radius ist, dann entspräche dies einer Kollision.

Edit: Wenn Du einen Beispielcode erwähnst wäre es praktisch einen Link zu posten!
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: 3D: Kollision von Entity und Node?

Beitrag von DarkDragon »

@Regenduft: so habe ich seine Frage anfangs auch verstanden, aber nach einiger Zeit hab ich festgestellt, dass er vielleicht wissen will, ob ein Entity mit einem der Entities eines Nodes kollidiert. Also praktisch eine Kollisionsüberprüfung aller Entities in der Node Hierarchie.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: 3D: Kollision von Entity und Node?

Beitrag von Regenduft »

@DarkDragon: Unabhängig ob Creepy das so gemeint hat oder nicht ist das ein interessanter Gedanke!

Ich habe noch nicht wirklich viel mit Nodes gearbeitet (außer um einen Sound3D daran zu hängen), habe aber mal flott einen Blick in die PB-Hilfe geworfen und vermute, dass dies dann mit EntityParentNode() funktionieren müsste.
Allerdings finde ich es seltsam, dass es scheinbar keine Möglichkeit gibt alle Objekte eines Nodes aufzulisten. Ebenso seltsam finde ich dass es für alle anderen Objekte keine Äquivalente gibt! Es gibt z.B. kein Sound3DParentNode() oder NodeParentNode() (wäre ja fast ein Feature-Request wert). Außerdem könnte man ja versehentlich ein Objekt an mehrere Nodes anhängen... :?

PS: Huch? In der aktuellen Beta gibt es ja überhaupt kein ExamineWorldCollisions() (und Zugehöries) mehr! Dafür aber eine "PickMaske" bei MousePick()? Da hätte ich eine Collisionsmaske praktischer gefunden. Wird wohl noch etwas Zeit vergehen, bis die Engine3D Library richtig ausgereift ist... (obwohl ich schon sagen muss, dass ich sie langsam richtig gut finde!)
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: 3D: Kollision von Entity und Node?

Beitrag von TheCreepyProgramer »

Erst einmal danke für die Antworten. Mit dem Code-Beispiel habe ich das Demo_Collision3D.pb Beispiel aus dem Code-Archiv gemeint. Aber wenn ich das mit den Nodes als Koordinaten-System richtig verstanden habe, dann ist doch damit keine richtige First-Person-Kamera möglich, oder täusche ich mich da?
Bild
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: 3D: Kollision von Entity und Node?

Beitrag von Regenduft »

Zunächst einmal muss ich Dir dringend raten die aktuelle PureBasic 5.00 Beta verwenden!
Drei Gründe:
  1. Die Engine3D ist bei PureBasic 4.61 IMHO unbrauchbar! (siehe auch hier)
  2. Bei der 5.00 wurde sehr vieles geändert und verbessert! Wenn Du jetzt das ganze mit der 4.61 lernst, dann musst Du bald (die Final ist ja schon in greifbarer Nähe) alles wieder umlernen und Deine alten Quelltexte mühsam anpassen!
  3. Die aktuelle Beta enthält einen Haufen sehr guter Beispiel-Codes!
Ich muss aber nochmal kurz betonen, dass ich auch Einsteiger bin, was 3D-Zeugs betrifft!
TheCreepyProgramer hat geschrieben:Aber wenn ich das mit den Nodes als Koordinaten-System richtig verstanden habe, dann ist doch damit keine richtige First-Person-Kamera möglich, oder täusche ich mich da?
Doch, das ist schon möglich, aber etwas anders, als man (oder zumindest ich :wink:) erstmal so intuitiv sich denkt.

Wenn man eine Entity an einen Node hängt, dann sind anschließend alle Bewegungen der Entity relativ zum Node. Das bedeutet also, dass wenn man die Physik aktiviert und die Entity "fallen lässt", dass sich dann die Entity auf der Y-Achse (solange man den Node nicht gedreht hat) des Nodes bewegt. Der Node folgt also nicht der Entity!

Jetzt nehmen wir aber mal folgendes an: Der Nullpunkt Deiner Entity sitzt auf Höhe der Füße und die Position des Kopfes befindet sich auf der Y-Achse bei 5.0 (einfach mal frei erfunden!). Wenn man nun die Kamera an den Kopf "dranhängen" möchte könnte man z.B. wie folgt vorgehen:
  1. Die Entity wird an keinen Node angehängt!
  2. Ein Node wird erstellt, an den man die Kamera bei Y=5.0 anhängt.
  3. Jedes mal, wenn die Entity bewegt wurde, bewegt man den Node zur selben Position wie die Entity.
  4. Dann richtet man den Node in die selbe Richtung wie die Entity aus.
  5. Fertig! <)
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: 3D: Kollision von Entity und Node?

Beitrag von TheCreepyProgramer »

Danke für die Antwort. Wenn man eine Fist-Person-Kamera so macht wie Du es beschrieben hast, dann ist es doch eigentlich sinnlos, dazu eine Node zu verwenden, schließlich dient die dazu, mehrere Objekte miteinander zu verknüpfen. Und zu der Physik hätte ich auch noch eine Frage:
Ich erstelle eine flache Welt mittels CreatePlane(), aber sobald ich die Physik-Engine aktiviere, fliegt alles durch diese Plane durch, muss ich erst die Kollisionen abfragen, um so etwas zu vermeiden?
Bild
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: 3D: Kollision von Entity und Node?

Beitrag von Regenduft »

TheCreepyProgramer hat geschrieben:Wenn man eine Fist-Person-Kamera so macht wie Du es beschrieben hast, dann ist es doch eigentlich sinnlos, dazu eine Node zu verwenden, schließlich dient die dazu, mehrere Objekte miteinander zu verknüpfen.
Da hast Du grundsätzlich Recht. Allerdings hat der Node den Vorteil, dass Du nicht jedesmal den Versatz von 5.0 auf der Y-Achse addieren musst (auf mein Beispiel bezogen), wenn Du die Kamera der Entity hinterherbewegst.
Ein weiterer Vorteil wäre, wenn Du z.B. ein Rennspiel machen willst (also Deine Entity ein Auto darstellt), dann kannst Du an den Node z.B. folgende Objekte hängen:
  • Hauptkamera (Blick nach vorne)
  • Rückspiegelkamera
  • Motorengeräusch (Sound3D)
  • Scheinwerfer und Rückleuchten (Light)
  • Spielername für andere Mitspieler (Billboard)
Da man ja nie weiß, was man noch alles für Geistesblitze im Laufe der Entwicklung hat, kann es ganz sinnvoll sein immer gleich einen Node (und später evtl. Subnodes) zu verwenden. Dann kann man später z.B. noch ohne Probleme ein sich drehendes Blaulicht dranbasteln oder was auch immer. Wie schon erwähnt, kann man sich auch eine Menge Hirnschmalz sparen, wenn ein Versatz im Spiel ist. Beispiel:

Code: Alles auswählen

; Das hier ist bequem, einfach, übersichtlich, flexibel, [weitere positive Wörter hier einfügen]: ;-)
NodeLocate(#KameraNode, EntityX(#Spielfigur), EntityY(#Spielfigur), EntityZ(#Spielfigur))

; Hier stellt der Versatz (+5.0) eine potentielle Fehlerquelle dar und kann leicht übersehen werden:
CameraLocate(#Kamera, EntityX(#Spielfigur), EntityY(#Spielfigur)+5.0, EntityZ(#Spielfigur))
TheCreepyProgramer hat geschrieben:Und zu der Physik hätte ich auch noch eine Frage:
Ich erstelle eine flache Welt mittels CreatePlane(), aber sobald ich die Physik-Engine aktiviere, fliegt alles durch diese Plane durch, muss ich erst die Kollisionen abfragen, um so etwas zu vermeiden?
Lies Dir mal die Hilfe zu EnableWorldPhysics(), EnableWorldCollisions() und EntityPhysicBody() durch.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten