3D: Kollision von Entity und Node?
-
- Beiträge: 42
- Registriert: 11.06.2011 13:22
3D: Kollision von Entity und Node?
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
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

Re: 3D: Kollision von Entity und Node?
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!
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)
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: 3D: Kollision von Entity und Node?
@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.
Re: 3D: Kollision von Entity und Node?
@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!)
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)
-
- Beiträge: 42
- Registriert: 11.06.2011 13:22
Re: 3D: Kollision von Entity und Node?
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?

Re: 3D: Kollision von Entity und Node?
Zunächst einmal muss ich Dir dringend raten die aktuelle PureBasic 5.00 Beta verwenden!
Drei Gründe:
) 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:
Drei Gründe:
- Die Engine3D ist bei PureBasic 4.61 IMHO unbrauchbar! (siehe auch hier)
- 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!
- Die aktuelle Beta enthält einen Haufen sehr guter Beispiel-Codes!
Doch, das ist schon möglich, aber etwas anders, als man (oder zumindest ichTheCreepyProgramer 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?

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:
- Die Entity wird an keinen Node angehängt!
- Ein Node wird erstellt, an den man die Kamera bei Y=5.0 anhängt.
- Jedes mal, wenn die Entity bewegt wurde, bewegt man den Node zur selben Position wie die Entity.
- Dann richtet man den Node in die selbe Richtung wie die Entity aus.
- Fertig!
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
-
- Beiträge: 42
- Registriert: 11.06.2011 13:22
Re: 3D: Kollision von Entity und Node?
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?
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?

Re: 3D: Kollision von Entity und Node?
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.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.
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)
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))
Lies Dir mal die Hilfe zu EnableWorldPhysics(), EnableWorldCollisions() und EntityPhysicBody() durch.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?
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)