Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Kollisionserkennung

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 05.12.2007, 20:47    Titel: Kollisionserkennung Antworten mit Zitat

Hallo Leute,
ich nehme mal an, dass bestimmt schon manche ein 3D Spiel programmiert haben. Ein Problem tut sich bei mir in Sachen Kollisionserkennung auf. Also weis jeand wie man das machen kann ohna auf irgendwelche Bibliotheken (wie newton.dll oder so) zurück zu greifen zu müssen? Da die Welten und Körper schon eher komplex ausfallen, muss da schon ein besseres System her als
Code:

If posx > 100 then
    posx = 100
end if
if posy > 100 then
    posy = 100
end if
... 'naja ihr wisst was ich meine happy

Danke schon mal

MfG Caran
_________________
Eine Erkenntnis von heute kann die Tochter eines Irrtums von gestern sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 05.12.2007, 22:06    Titel: Antworten mit Zitat

Kollisionserkennung ist kein einfaches Thema, im bereich der 3D Programmierung.

Ich hab jezt leider keine Passenden Links für dich da, aber ich kann gerne mal nach einigem suchen. In VB hätt ich einen Code.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 05.12.2007, 23:37    Titel: Antworten mit Zitat

deine modele sollten alle ihre "größe" kennen (sowas wie den radius einer kugel der sie umgibt, wo sie ganz reinpassen), damit machst du erstmal einfach ne abstandsberechnung zu allen anderen objekten und schaust ob ne kollision sein könnte, dann gehste hin und prüfst auf speziell angelegte Kollisionsboxen, ungefähr so - und dann musste halt diese ganzen einzelnen boxen kollidieren.

So viel zum grundsätzlichen Vorgehen, das genaue kollidieren von den boxen darf dir jemand anderes erklären. Solltest du allerdings ne extrem präzise kollisionserkennung basteln wollen musst du natürlich alle polygone deines models einzeln testen. ach und nicht zu vergessen - wenn sich dein objekt bewegt reicht es oft nicht aus, nur die position nach der bewegung zu testen, auch hier, wenn du's genau testen willst musst du praktisch die gesamte bewegungsbahn prüfen, entweder über abtasten bei schneller bewegung (ungenau aber reicht eventuell) oder eben über richtig geometrie mit schnitt der bewegungsgeraden und der hitbox-(oder polygon)ebenen. - und sei gewarnt, die komplexität von sowas kann unter umständen sehr schnell explodieren - effektive implementierung solcher sachen bedarf eines durchaus lägeren studiums des Themas.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 06.12.2007, 01:48    Titel: Antworten mit Zitat

MisterD hat Folgendes geschrieben:
... ungefähr so - und dann musste halt diese ganzen einzelnen boxen kollidieren.

Jo .. das is eine der einfacheren Methoden.

Das läst sich natürlich auch erweitern, indem man bei Kolision einer "Grossen" Box diese Box dynamisch verfeinert, und diese auf kolision prüft. Anschliessend kann man das noch weiter verfeinern (Polygontiefe) ...

MisterD hat Folgendes geschrieben:
... - und sei gewarnt, die komplexität von sowas kann unter umständen sehr schnell explodieren - effektive implementierung solcher sachen bedarf eines durchaus lägeren studiums des Themas.
Oh JAAAA ... das ist SEHR SEHR Komplex ... und es gibt nicht sehr viele gute Codes, die Polygon / Vektorkollisonserkennung ermöglichen.

Stell dir das nicht zu einfach vor.

Hier mal meine Vector Basierende Kollisionsprüfung: http://rafb.net/p/hanDV624.html

Sind Mehrere Varianten.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bimi



Anmeldungsdatum: 03.12.2007
Beiträge: 66

BeitragVerfasst am: 06.12.2007, 08:11    Titel: Antworten mit Zitat

Nach jeder Neuberechnung eines Objektes zu prüfen ob es sich mit irgendeinem andren Objekt schneidet wäre zu aufwändig.

Kollisionserkennung bei 3D Spielen funktioniert nach dem Octree-Verfahren (Quadtree im 2D Raum).

Stell dir einen Zauberwürfel vor. Der virtuelle Spielraum wird in kleine Segmente unterteilt so wie die Segmente bei einem Zauberwürfel. Stelle dir einen Raum mit 10*10*10 m Kantenlänge vor.
Octree grad 0: 1 Teilraum zu 10m kantenlänge
Octree grad 1: 8 Teilräume zu 5m Kantenlänge
Octree grad 3: 64 Teilräume zu 2,5m Kantenlänge
...

Je höher der Grad desto feingranularer ist der Baum. Bei der Berechnung der Position des Objektes nach seiner Bewegung wird diese Position in die entsprechende Zelle im Octree vermerkt. Erst wenn mehr als ein Objekt ganz oder Teilweise diese Zelle belegen, muss zwischen diesen beiden und nur zwischen diesen beiden geprüft werden ob es zu einer Kollision kam.

Die eigentliche Kollision wird bei einfachen Objekten durch eine boolsche Verknüpfuung der konvexen Hülle oder Bounding Box erreicht. Ist die Schnittmenge ungleich 0, hat es gekracht.

Oktrees verhindern dabei das z.B. bei einem Flugsimulator jeder popels Baum auf kollision geprüft werden muss - durch den Octree weiss ich welche unmittelbar in der nähe liegen und muss nur die prüfen.

Der große Nachteil von Octrees ist, das sie bei höherer Granularität Speicher ohne Ende fressen. Die Lösung hierfür nennt sich schwach besetzte Octrees - aber das würde hier zu weit führen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bimi



Anmeldungsdatum: 03.12.2007
Beiträge: 66

BeitragVerfasst am: 06.12.2007, 08:38    Titel: Antworten mit Zitat

[quote="ThePuppetMaster"]
MisterD hat Folgendes geschrieben:

Stell dir das nicht zu einfach vor.

Hier mal meine Vector Basierende Kollisionsprüfung: http://rafb.net/p/hanDV624.html

Sind Mehrere Varianten.


...so würde ich es definitiv nicht machen...zwinkern

Kollisionserkennung im OO-Pseudocode:

Code:

Raumschiff.berechneNeuePosition (bewegungsvektor);
Oktree.update (Raumschiff); // setzt das richtige Leaf im Octree

Object FUNCTION isCollision (Objekt myObj) {
  if (Oktree.getleafof(myObj).numObjs > 1) {
     konvHuelle kV = myObj.getKV ();
     Leaf leaf = getleafof(myObj);

     foreach (Object obj = leaf.getNextObj()){
        if (obj == myObj) continue;  // Kollision mit sich selbst...
        konvHuelle tmp = obj.getKV ();
       
        if (schnittmenge (myObj,tmp) > 0)
          return tmp; //Collision with object in tmp
     }
  }
  return null; // means no Collision
}

if (NULL !=  (Object col = isCollision (Raumschiff))) {
  // Rums, schepper, knall
}



Der Code geht davon aus, das ein Objekt gleichzeitig immer nur mit einem anderen kollidiert - reicht in manchen Fällen aber nicht aus...

getKV berechnet die konvexe Hülle
schnittmenge berchnet ob sich zwei konvexe Hüllen überschneiden. Eine KV ist in der Regel eine Set aus Bounding boxes (im Idealfall nur eine) die gegen Überschneidung getestet werden.

Bei der Optimierung ist darauf zu achten das es keinen Sinn machte jedes Objekt in seiner feinsten Feinheit zu vergleichen. Ansonsten wird die Sache so richtig teuer und diese Zeit hat man nicht.

Bei einer Refreshrate von sagen wir 25 f/s bleiben 40ms für die Berechnung UND Darstellung eines Frames. Nebenbei muss noch die Spiellogig berechnet werden, Sound soll auch noch kommen und zu allem Überfluss wie der Spieler auch noch etwas eingeben können. Faustregel: 5-10% für den kompletten Collisiondetect, macht 2-4ms....

Lass mal den von dir verlinkten Algorithmus laufen - sieht nett aus, funktioniert mit Sicherheit auch tadellos, aber so kann es nicht funktionieren...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 06.12.2007, 16:35    Titel: Antworten mit Zitat

wie gesagt, wie mans macht kommt immer drauf an wie genau mans haben will zwinkern so n voxel-engine-mäßiges octtree verfahren ist für das meiste sicher ausreichend (wenn man die richtige auflösung findet), für wirklich genaue simulationsmodelle braucht man dann doch die geometrische lösung mit viel mathe.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bimi



Anmeldungsdatum: 03.12.2007
Beiträge: 66

BeitragVerfasst am: 06.12.2007, 17:33    Titel: Antworten mit Zitat

MisterD hat Folgendes geschrieben:
wie gesagt, wie mans macht kommt immer drauf an wie genau mans haben will zwinkern so n voxel-engine-mäßiges octtree verfahren ist für das meiste sicher ausreichend (wenn man die richtige auflösung findet), für wirklich genaue simulationsmodelle braucht man dann doch die geometrische lösung mit viel mathe.


Ich bin eher von Computerspielen ausgegangen.

In der Regel habe ich bei Simulationsmodellen das Ehctzeitproblem nicht, weshalb ich mir dann auch eine "Ausführlichkeit leisten kann"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 06.12.2007, 17:54    Titel: Antworten mit Zitat

[OT]
Bimi, warum stellst du dich nicht mal vor? Würd mich mal intressiern wer du bist, so.... und sicher nicht nur mich, hier stürzt so ne gewaltige Ladung KnowHow auf einmal rein, und keiner weiß wo vorn und Hinten ist happy
[/ot]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bimi



Anmeldungsdatum: 03.12.2007
Beiträge: 66

BeitragVerfasst am: 06.12.2007, 18:49    Titel: Antworten mit Zitat

PMedia hat Folgendes geschrieben:
[OT]
Bimi, warum stellst du dich nicht mal vor? Würd mich mal intressiern wer du bist, so.... und sicher nicht nur mich, hier stürzt so ne gewaltige Ladung KnowHow auf einmal rein, und keiner weiß wo vorn und Hinten ist happy
[/ot]


Ich bin freberufliche IT-Consultant und arbeite seit rund 25 Jahren in dieser Branche. Schwerpunkt ist die Systementwicklung auf Großrechnern, graphische Anwendungen (u.a. Spiele) sowie die Entwicklung zeitkritischer Problemlösungen.

Ich spreche Assembler (einige Systeme, unter anderem x86 in 16 und 32 Bit), C/C++, Java, Perl, PHP, Phyton, BASIC und ein bischen Smalltalk, Fortran und LISP - nur der COBOL-Kelch ist an mir vollständig vorrübergegangen...

Zu FreeBasic bin ich gekommen weil ich nach einer Umgebung für kleine Anwendungen gesucht habe. Mal kurz ne DLL basteln oder ein Proggi das alle Laufwerke nach Dateidubletten durchsucht, dafür sind mit andere Sprachen zu Überladen oder zu schwergewichtig.

FB hab ich zufällig entdeckt und war begeistert - vor allem durch die Möglichkeit die Sprache durch Libs beliebig erweitern zu können und somit mein C/C++ Ergüsse auch hier nutzen zu können. Das die Performance auch noch sehr gut ist, kommt noch dazu.

Einfach ohne großen Overhead und dennoch Leistungstark - mir gefällt es.

Einen Bildpunkt auf den Bidlschirm setzen - in welcher Sprache geht das noch mit zwei Zeilen....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 06.12.2007, 19:51    Titel: Antworten mit Zitat

svg happy
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 07.12.2007, 12:42    Titel: Antworten mit Zitat

Zitat:

Einen Bildpunkt auf den Bidlschirm setzen - in welcher Sprache geht das noch mit zwei Zeilen....


...in gfa32-basic(jetzt freeware- bis vista lauffähig). progge ich parallel zu freebasic.
wenn du die do-until-schleife(halteschleife) weglässt, hast du 2 zeilen.

-------------------------------------------
OpenW 1, 300, 0, 500, 500, -1 ' -1 = complettes winfenster mit button , scrollleiste usw

Plot 100, 100

Do
Sleep
Until Me Is Nothing
-------------------------------------------
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 07.12.2007, 20:42    Titel: Antworten mit Zitat

Hallo erstmal,
da hat sich ja schon ganz schön was angehäuft. Also ich danke euch allen und noch eine Frage am Rande:
Wie kann man mit ogl gucken ob vor einem bestimmten Punkt etwas gezeichnet wurde oder nicht? Geht das?

MfG Caran
_________________
Eine Erkenntnis von heute kann die Tochter eines Irrtums von gestern sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 08.12.2007, 19:07    Titel: Antworten mit Zitat

das geht.
bei opengl hat ja eine fläche zb die länge 1 und die breite 1 oder die länge ist 10 und die breite ist 10. da bringst du ja deine texture unter. dann bestimmst du ja wie oft die texture in der länge 1 und in der breite 1 erscheinen soll, ist es mehr als 1mal, hast du sogenannte kachel, das macht man nur wenn der übergang nicht so gut erkennbar ist als trennstelle.
also kannst du in der länge 1 zb 10mal deine texture unterbringen.
lassen wir es mal bei länge 1.
wenn die texture 1mal in der fläche erscheint , teils du die länge 1 durch die anzahl der pixel in der länge und 1 durch die anzahl der pixel in der breite.
eine textur-bmp 512*512pixel :
wenn du jetzt auf der opengl-textur langmarschierst, gehst du zb 25*1/512 einheiten (also 0,0488281 auf der opengl-fläche, so macht man es ja auch bei translate)), das sind dann 25 pixel auf deiner bmp-texture und da fragst du ab, welche farbe jetzt der punkt hat.

du hast sozusagen deine pixel-bmp-fläche genau unter deiner opengltexture-fläche liegen und produzierst deinen weg auf deine bmp-fläche.

das musst du jetzt programmrieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 09.12.2007, 14:17    Titel: Antworten mit Zitat

na also ich weis nicht so recht ob das mir dabei hilft...ich hatte da eher so an DepthBuffer gedacht, um zu kontrollieren ob vor einer Position im Raum ein Polygon gezeichnet wurde, sprich, ob man es sieht. Vielleicht habe ich mich einfach nur falsch ausgedrückt, trotzdem danke.
MfG Caran
_________________
Eine Erkenntnis von heute kann die Tochter eines Irrtums von gestern sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
atari
gesperrt


Anmeldungsdatum: 26.08.2007
Beiträge: 144

BeitragVerfasst am: 09.12.2007, 14:49    Titel: Antworten mit Zitat

...ich hatte da eher so an DepthBuffer gedacht....

kannste bei opengl vergessen.



...ob vor einem bestimmten Punkt etwas gezeichnet ....

das kontrollierst du dann auf der bmp-datei.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 09.12.2007, 15:36    Titel: Antworten mit Zitat

atari hat Folgendes geschrieben:
...ich hatte da eher so an DepthBuffer gedacht....

kannste bei opengl vergessen.



...ob vor einem bestimmten Punkt etwas gezeichnet ....

das kontrollierst du dann auf der bmp-datei.


der depth buffer is in gl relativ leicht auslesbar, damit collisionserkennn zu basteln wird aber ws. eher nicht funktionieren. was willst du genau anstellen?
_________________
Yagl - yet another gameprogramming library
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Caran



Anmeldungsdatum: 11.03.2007
Beiträge: 290
Wohnort: Lörrach

BeitragVerfasst am: 09.12.2007, 16:14    Titel: Antworten mit Zitat

Nee also das mit dem Kotrollieren ob vor einem bestimmten Punkt schon etwas gezeichnet wurde, war eigentlich eone Frage für sich und hat nichts mehr mit Kollisionserkennung zu tun (wollt halt keinen neuen Thread deswegen anfangen). Also ich habe in einem Spiel gesehen, dass wenn man auf die Sonne sieht auch noch Lichtstrahlen gezeichnet werden und wenn etwas vor der Sonne war, waren die Lichtstrahlen nicht mehr sichtbar. Also wenn etwas einen Punkt (hier die Sonne)verdeckt, wird etwas gemacht oder nicht (hier das Zeichnen der Strahlen). Mich hat halt mal interessiert wie das funktioniert.
_________________
Eine Erkenntnis von heute kann die Tochter eines Irrtums von gestern sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 09.12.2007, 20:25    Titel: Antworten mit Zitat

wenn du von einer lichtquelle wie der sonne ausgehst, ist das gar nicht so schwer. nimm an sie ist unendlich weit entfernt, d.h jedes andere objekt kann sie verdecken. schritt 1: winkel zwischen vektor vom betrachter zur sonne und dem richtungsvektor des betrachters errechnen > vektoren normalisieren und punktprodukt. gilt min winkel < winkel < max winkel zeige die strahlen. das wäre eine abart des lensflares. min und max winkel kannst du selbst wählen, bispielwerte 0, 20. mach das selb anstatt mit der sonnen mit allen bjekten die die sonne verdecken können. siehst du mindestens ein objekt unter dem winkel schalte die strahlen aus. dieser ansatz ignoriert objektgrößen.

willst du übertrahleffekte solltest du dir hdr rendering anschaun. is aber ein weni komplexer

hth
_________________
Yagl - yet another gameprogramming library
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz