Kollision will nicht (parent-kollision ?)
Übersicht

![]() |
Kernle 32DLLBetreff: Kollision will nicht (parent-kollision ?) |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hiho,
ich habe im moment ein problem zu dem mir einfach keine Lösung einfällt. Ich habe ein relativ komplexes 3D Objekt, das ich auf Kollision mit meiner Map prüfen will. Eine "normale" Kollisionsabfrage klappt nicht da ich weder mit EntityBox noch mit EntityRadius eines der beiden 3D-Gebilde präzise genug definieren kann. MeshesIntersect habe ich auch bereits probiert, aber damit nur erreicht das mein Game sofort seeeehr langsam lief und die Kollision mal super und mal absolut unakzeptabel (Spieler auf einmal außerhalb der Map O_o) lief. Jetzt habe ich eine neue Idee. Ich benutze einfach die Sphere-Polygon Kollision, und "baue den Spieler mit Kugel nach". Gesagt getan... Problem ist nun das ich meine Kugel-Konstruktion jetzt nicht "als ganzes" auf Kollision prüfen kann. Und wenn ich jedes einzeln prüfe dann kann es gut sein das bei einem Hinderniss o.ä. eine der Kugeln irgentwo hängenbleibt, der rest sich aber normal weiterbewegt. Ganz zu schweigen vom Spieler-Mesh selbst das sich auch weiterbewegt wenn er es durch die Kugel-Kollisions-Dingsda nicht sollte. Also Gentlemen, vorschläge ? Ich hab keine Ideen mehr, und ohne ziemlich genaue Kollisionsabfrage kann ich mein aktuelles Projekt nicht weiter machen. Bin für jeden Gedankenanstoß oder Codeschnipsel dankbar. So long, Kernle |
||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
![]() |
SYSThern |
![]() Antworten mit Zitat ![]() |
---|---|---|
hallo
nun mach halt das wenn eine der "kugeln" kollidier sagst du es der anderen.... und dann lässt du alle stopen ect... : kugel1 kollidiert mit map wenn kugel1 kollidiert dann gehen =0 wenn kugel 2 kollidiert dann gehen =0 mfg SYSThern |
||
Tools and Programms
-------------------- www.systhern.de |
![]() |
Kernle 32DLL |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weis nicht ob ich verstanden habe, aber evt. vermittelt ja dieses Bild mehr mein Problem...
Edit: BMP gefixt... Sorry für den Anfängerfehler... war mir voll entgangen ![]() Von den Kugeln ist entweder eine der Parent und die restlichen seine Childs, oder alle Kugeln sind direkt zum Playermodell Ge-Child-et. Das was auf dem Bild zu sehen ist, ist die unweigerliche konsequenz. Und genau das soll nicht passieren. Alle Kugel sollten beim obersten Hinderniss anhalten. So long, Kernle |
||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
- Zuletzt bearbeitet von Kernle 32DLL am Mi, Dez 24, 2008 14:29, insgesamt einmal bearbeitet
![]() |
SYSThern |
![]() Antworten mit Zitat ![]() |
---|---|---|
also
du wenn eine kugel kollidert sagst du es den anderen und stoppst deren bewegung...(wirklich nicht schwer) mfg SYSThern |
||
Tools and Programms
-------------------- www.systhern.de |
![]() |
Kernle 32DLL |
![]() Antworten mit Zitat ![]() |
---|---|---|
Joa, aber das problem ist das ich nie früh genug weis wann die anderen stoppen müssen. Wenn ich ne Kollisionsabfrage mit "Collisions" und "EntityType", etc. mache und dann alle Kugel mit MoveEntity bewege, dann werden die anderen Kugel schon ein stück verschoben sein bevor ich die Kollision abfragen kann und weis dass die Kugeln eigentlich schon gestoppt haben sollten.
Wenn ich das ganze Gebilde Stück für Stück bewege (0.1 oder 0.01 oder so) könnte ich auch direkt ne Kontrolle mit MeshesIntersect zwischen der Map und dem Spieler machen und den letzten Schritt rückgängig machen bis alles passt.. Beides eine unsinnige Performence-Verschwendung :/ Und genau da liegt mein Problem, ich weis einfach nicht wie ich die Kollision quasi rechtzeitg abfragen kann. Geht das einfahc nicht oder habe ich da irgentwo einen ganz anfängerhaften Denkfehler ? Ich meine, ich müsste doch eigentlich das ganze Kugelgebilde als ganzes bewegen, da ich auch die Kollisionsabfrage als ganzes haben müsste. Oder ? (Oder denke ich eh komplett falsch ?) So long, Kernle PS: Sorry das ich so lange net geantwortet hatte, war im Weihanchtsstress... |
||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oder man überprüft selbst und stellt es auch selbst ein, wenn was nicht passt.
Code: [AUSKLAPPEN] Graphics3D 800,600,0,2
SetBuffer BackBuffer() Local Timer=CreateTimer(10) Local Camera=CreateCamera() PositionEntity Camera,0,0,-8 CameraProjMode Camera,2 CameraZoom Camera,0.1 Local Light=CreateLight() RotateEntity Light,40,-40,0 Local Cube1=CreateCube() Local Cube2=CreateCube() Local Cube3=CreateCube() PositionEntity Cube1,0,6,0 PositionEntity Cube2,2,4,0 PositionEntity Cube3,4,5,0 EntityType Cube1,2 EntityType Cube2,2 EntityType Cube3,2 Local Sphere1=CreateSphere(24) Local Sphere2=CreateSphere(24) Local Sphere3=CreateSphere(24) PositionEntity Sphere1,0,0,0 PositionEntity Sphere2,2,0,0 PositionEntity Sphere3,4,0,0 EntityType Sphere1,1 EntityType Sphere2,1 EntityType Sphere3,1 Local Count%,YP# Collisions 1,2,3,1 For Count=0 To 60 MoveEntity Sphere1,0,0.1,0 MoveEntity Sphere2,0,0.1,0 MoveEntity Sphere3,0,0.1,0 UpdateWorld YP=EntityY(Sphere1) If YP>EntityY(Sphere2) Then YP=EntityY(Sphere2) If YP>EntityY(Sphere3) Then YP=EntityY(Sphere3) PositionEntity Sphere1,0,YP,0 PositionEntity Sphere2,2,YP,0 PositionEntity Sphere3,4,YP,0 RenderWorld Text 20,20,"Schritt: "+Count Text 20,40,EntityY(Sphere1)+" "+EntityY(Sphere2)+" "+EntityY(Sphere3) WaitTimer Timer Flip 0 Next Eine nicht besonders elegante Lösung, aber eine bessere ist mir auch nicht eingefallen. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo..
das problem läst sich mit folgender Idee lösen. 1. An der Position wo die Kollisions Kugeln sind erzeugst du Pivot Points die an das Object gebunden sind. 2. èber eine schleife positionierst du die Kollisions Kugeln immer an die Position der Pivot Points. 3. Wird eine Kollision erkannt (EntityType auf Kugel nicht auf Pivot) kannst du den Positions Unterschied zwischen Pivot und Kugel dazu nutzen zu entscheiden was geschehe soll. Mit EntitX() etc kannst du dann das Object auch wider zurückstellen. Indem du es an die Positions verschiebung im Negativem sinne ferschiebst. Ist ein wenig komplex. Aber so geht es. Gruss TFT |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
![]() |
Kernle 32DLL |
![]() Antworten mit Zitat ![]() |
---|---|---|
Theoretisch sollte das funktionieren. Aber es gibt da 2 Probleme:
1) geht das auch wenn das ganze Gebilde gedreht ist ? Sollte schon denke ich ? 2) Ist das doch ne enorme Performence verschwendung das Objekt so stück für stück zu bewegen, oder nicht ? So long (und frohes Fest), Kernle |
||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Erfahrung hat gezeigt, dass es für den Fragesteller auch oft besser ist, sein eigendliches Ziel zu erläutern anstelle sein Codeproblem zu lösen. Soll heissen: Teile uns dein eigendliches Ziel mit, und wir können eventuell eine ganz andere Vorgehensweise vorbringen. Denn dein Vorgehen ist so in der Form nur schlecht in praktischer Form nachvollziehbar. Gerade noch ''unerfahrene'' Hobbyentwickler gehen oft einfachste Sachen komplett kompliziert an. Ansonsten ist mein Code - falls deine 2) sich darauf bezieht - nicht besonders Recourcenfressend. Es werden ja schliesslich nur zwei If-Abfragen gemacht und Neupositionierungen durchgeführt.
Edit1: Dein gepostetes Bild, welches sich von unten nach oben aufbaut, sagt mir dass du eine BMP hochgeladen hast. Es wäre echt vom Vorteil, wenn man das unterlassen würde und zuvor die Bilder in PNG oder JPG abspeichert. Das erspart uns allen unnötige Downloadzeiten dieser Seite. Selbst MS-Paint kann in PNG oder JPG speichern. |
||
![]() |
Kernle 32DLL |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sry Hectic, das mit der BMP war mir garnet aufgefallen. Hab ich natürlich sofort gefixt ![]() Zum Problem... ich versuche mal das Problem so gut wie möglich zu beschreiben. Also, der Level wird einfach als normales Mesh geladen. Ebenso der Spieler. Der Spieler kann bis zu einem bestimmten Winkel auf der Z-Achse gedreht werden (10-20 Grad denke ich), die Bewegung wird variabel durch Usereingabe auf X und Y Achse verteilt. Um das ganze mal in praxis zu sehen verweise ich auf diesen Post von mir. Die Bewegung intern besteht aus 2 Befehlen. Zuerst wird der Spieler entsprechend der Neigungseinstellung gedreht, und dann werden beide Achsen (X und Y) gleichzeit per MoveEntity bewegt. Soviel dazu. Das Problem ist nun, das ich keinerlei korrekt funktionierende Kollision zwischen dem Spieler und der Map hinbekomme. Ein einfacher "Collisions" Check funktioniert nicht, da weder der Spieler noch die Map eine Kugel ist (haha). Daher hatte ich die Idee den Spieler aus Kugeln nachzubauen, damit die Kollisionsabfrage geht - aber auch das funktionierte nicht (siehe posts oben). Eine Bewegungsabfrage ala Hectic's habe ich ebenfalls bereits versucht, aber die lief dank MeshesIntersect ziemlich langsam, und war trotsdem fehlerhaft :/ Ich hoffe ich konnte mein Problem diesmal besser beschreiben ? Ich glaube ich tu mir generell mit sowas schwer :/ geez... So long (und frohes Fest), Kernle |
||
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog] Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89 Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009 |
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo ....
da reicht eigentlich eine Kugel Kollision aus. Du must nur daran denken das du die abfragen in der richtigen reihenfolge machst. Position der Kugel merken. Erst die Kollisions Kugel in die richtung bewegen wo das Flugzeug hin soll. Dann updateworld. Prüfen ob eine Kollision stattfand. Wenn nein dann Flugzeug an die Kugel Position setzten. Wenn ja Kollisions Gereusche setzen Kugel auf der x Achse auf die position stellen- 1% der position die oben gemerkt wurde. Das Flugzeug ebenfals auf dieses Position setzten. Dann Renderworld. Die verschiebung -1% ist für die korrekte funktion der Blitz eigenen Kollisionserkennung wichtig. Ist ja logisch, da die Slide Funktion nur kollisionen erkennt die sich am schneidepunkt des Radius und der Fläche befindet. Liegt dieser auch nur gleichauf wird keine Kollision erkannt. Oder gelegentlich ingnoriert. Das hatt was mit den Rundungsfehlern zu schaffen. Die Blitz zu eigen sind. Gruss TFT |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group