[B3d] Kollisionstutorial
Übersicht

FBI-blitzBetreff: [B3d] Kollisionstutorial |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Kleines Tutorial für 3D-Kollisionen für Anfänger:
Um eine Kollisionsabfrage in einem 3D-Spiel funktionsfähig hinzukriegen, werden folgende Befehle benötigt: Code: [AUSKLAPPEN] Entitytype
Collisions Countcollisions Entityradius Text Updateworld Renderworld Flip Etc. Erst erstellen wir die Kamera und ein Licht: Code: [AUSKLAPPEN] GRAPHICS3D 640,480
SETBUFFER BACKBUFFER() camera=CREATECAMERA() ROTATEENTITY camera,45,0,0 POSITIONENTITY camera,0,15,-10 light=CREATELIGHT() ROTATEENTITY light,45,0,0 Diese Befehle müsstest du eigentlich kennen! Dann erstellen wir drei Objekte: Eine Kugel, einen Würfel und einen Zylinder:: Code: [AUSKLAPPEN] sphere=CREATESPHERE(32) ;Kugel erstellen POSITIONENTITY sphere,0,11,0 ;Positionieren cube=CREATECUBE() ENTITYCOLOR cube,0,100,0 POSITIONENTITY cube,0,-5,0 SCALEENTITY cube,10,10,10 cylinder=CREATECYLINDER(32) ENTITYCOLOR cylinder,255,0,0 POSITIONENTITY cylinder,0,7,0 SCALEENTITY cylinder,2,2,2 Die Kugel stellt hier den Spieler dar. Jetzt kommen wir zu den neuen Befehlen: Mit ENTITYTYPE wird dem Objekt ein Typ zugewiesen. Dieser wird nachher bei der kollisionsabfrage noch gebraucht. Also: Code: [AUSKLAPPEN] ENTITYTYPE sphere,1
ENTITYTYPE cube,2 ENTITYTYPE cylinder,2 Der erste Parameter ist das Objekt, der zweite der Typ. Du könntest auch 2642 oder eine x-beliebige Zahl nehmen. Währe aber unübersichtlicher... Jetzt müssen wir noch die Reichweite festlegen, d.h., in welcher Entfernung das Objekt kollidiert. Stell dir den Radius wie ein Schutzschild vor. Den Radius legst du mit entityradius fest: Code: [AUSKLAPPEN] ENTITYRADIUS sphere,1
Erster Parameter: Objekt, der zweite ist der Radius! Jetzt kommen wir zur Hauptschleife. Mit den Pfeiltasten kann man die Kugel bewegen: Code: [AUSKLAPPEN] WHILE NOT KEYDOWN(1)
x#=0 y#=0 z#=0 IF KEYDOWN(203)=1 THEN x#=-0.1 IF KEYDOWN(205)=1 THEN x#=0.1 IF KEYDOWN(208)=1 THEN z#=-0.1 IF KEYDOWN(200)=1 THEN z#=0.1 MOVEENTITY sphere,x#,-0.1,z# UPDATEWORLD RENDERWORLD FLIP WEND END Soweit, so gut. Und jetzt kommen wir zur Kollision: Wir brauchen einen Befehl, der überprüft, ob zwei Objekte miteinander kollidieren. Der heißt collisions. Er überprüft aber nicht die Kollision zwischen zwei Objekten, sondern zwischen zwei Typen. Die hast du vorher festgelegt (mit entitytype). Der Befehl überprüft also, ob also ein Objekt mit dem einen Typ mit einem Objekt mit dem zweiten Typ kollidiert. Zwei Parameter haben wir schon mal: den ersten (Typ 1) und den zweiten (Typ 2). Als dritter wird die Methode gewählt. Folgende stehen zur auswahl: 1=Kugel-Kugel-Kollision 2=Kugel-Polygon-Kollision 3=Kugel-Würfel-Kollision Diese erkläre ich jetzt nicht, da wir immer den 2. verwenden werden! Und der vierte Parameter gibt an, was passieren soll, wenn eine Kollision stattfindet! Folgende Reaktionen stehen zur auswahl: 1=stoppen 2=sliden (normal) 3=sliden (nur raufsliden) Stoppen ist klar. Sliden bedeutet, dass das kollidierende Objekt (Typ 1) sich einen Weg an dem Objekt vorbeisucht. Kleine Anmerkung: In BB selbst gibt es KEINE Möglichkeit zu wählen, dass nach einer Kollision gar nichts passieren soll. Wir verwenden nur Parameter 1. Schon haben wir den Befehl collisions erarbeitet: Code: [AUSKLAPPEN] COLLISIONS 1,2,2,1
Entspricht: Kollidiert ein Objekt mit Typ 1 (In diesem Fall Kugel) mit einem Objekt mit Typ 2 (in diesem Fall Würfel und Zylinder), und zwar über die Kugel-Polygon-Methode, dann stoppt der Typ 1. Das bauen wir jetzt nur noch in die Schleife ein: Code: [AUSKLAPPEN] WHILE NOT KEYDOWN(1)
x#=0 y#=0 z#=0 IF KEYDOWN(203)=1 THEN x#=-0.1 IF KEYDOWN(205)=1 THEN x#=0.1 IF KEYDOWN(208)=1 THEN z#=-0.1 IF KEYDOWN(200)=1 THEN z#=0.1 MOVEENTITY sphere,x#,-0.1,z# COLLISIONS 1,2,2,2 UPDATEWORLD RENDERWORLD FLIP WEND END Ganz wichtig hier aber: Das Updateworld. Nur so wird richtig überprüft. Jetzt kommt etwas kompliziertes: Der Index-Wert. Natürlich können während eines Schleifendurchlaufs mehrere Kollisionen stattfinden. Jeder Kollision wird eine Nummer zugewiesen. Diese bezeichnet man auch als Index. Die Anzahl der Kollisionen ermittelt man mit countcollisions. Wenn dieser Befehl z.B. 5 zurückgibt, wissen wir, dass 5 Kollisionen stattgefunden haben. Und die erste hat den Index 1, die zweite 2, die dritte 3, die vierte 4 und die fünfte eben 5! Jetzt können wir auch ganz leicht rausfinden, mit welchem Objekt genau die Kugel kollidiert hat: Mit collisionentity. Als Parameter geben wir erstens das Ursprungsobjekt (Typ1 – Kugel) an, und als zweiten den Index. Um auch alle Kollisionen zu erfassen, machen wir das ganze in einer Schleife: Code: [AUSKLAPPEN] col=COUNTCOLLISIONS(sphere)
TEXT 0,0,"Anzahl Kollisionen: " FOR index=1 TO col TEXT 000,i*20,"Entity="+COLLISIONENTITY(sphere,index) NEXT Das Programm sagt sooft, wie es Kollisionen gibt, das jeweilige Objekt. Das bauen wir auch noch in die Hauptschleife ein: Code: [AUSKLAPPEN] WHILE NOT KEYDOWN(1)
x#=0 y#=0 z#=0 IF KEYDOWN(203)=1 THEN x#=-0.1 IF KEYDOWN(205)=1 THEN x#=0.1 IF KEYDOWN(208)=1 THEN z#=-0.1 IF KEYDOWN(200)=1 THEN z#=0.1 MOVEENTITY sphere,x#,-0.1,z# COLLISIONS 1,2,2,2 UPDATEWORLD RENDERWORLD col=COUNTCOLLISIONS(sphere) TEXT 0,0,"Kollision(en):" FOR i=1 TO col TEXT 000,i*20,"Entity="+COLLISIONENTITY(sphere,i) NEXT FLIP WEND END Und fertig. Jetzt könnt ihr das alles in den BB-Editor kopieren und laufen lassen! (Nicht vergessen, das wo die Objekte erstellt werden und der Radius sowie der Typ zugewiesen wird, mitzunehmen!) FBI-blitz |
||
- Zuletzt bearbeitet von FBI-blitz am Mo, Apr 17, 2006 19:17, insgesamt einmal bearbeitet
morszeck |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bitte folgendes:
- immer den kompletten Quellcode oder Tutorial hier posten und nicht ein Link zu einem Zip - keine Word oder sonstige macroverseuchte Formate verwenden. Auch hat nicht jeder Word... Danke |
||
![]() |
Unplugged |
![]() Antworten mit Zitat ![]() |
---|---|---|
- immer den kompletten Quellcode oder Tutorial hier posten und nicht ein Link zu einem Zip
- keine Word oder sonstige macroverseuchte Formate verwenden. Auch hat nicht jeder Word... Wieso diese seltsamen Regeln? |
||
User posted image |
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
mein word funktioniert nicht - also hat er recht mit den regeln
außerdem lade ich mir nich ne zip runter...zu aufwendig ER HAT VOLLKOMMEN RECHT !!!!!!!!! ^^ |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
![]() |
wunderkind |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man muss es ja nicht gleich so schroff ausdrücken wie Kryan. Aber bitte poste den Quellcode doch tatsächlich hier im Klartext. Dieser Forenbereich hat schließlich auch Archiv- und Nachschlagecharakter. Wenn du eines Tages deine Zip-Datei vom Server entfernst, dann können die Besucher des Forums das Tutorial nicht mehr lesen.
Selbstverständlich ist es kein Problem, wenn du den Link oder sonstige Verweise zusätzlich angibst. Viele Grüße Dein Blitzforum.de Service Team |
||
![]() |
Klip |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Link funktioniert leider nicht mehr.
Kannst du das Tutorial nicht nochmal neu hochladen? |
||
IonPainter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wunderkind hat Folgendes geschrieben: Wenn du eines Tages deine Zip-Datei vom Server entfernst, dann können die Besucher des Forums das Tutorial nicht mehr lesen.
wie Recht er hatte... ![]() |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja, gib mal nen neuen link, ode poste den code, das könnte ich mal gebrauchen.....sofern es gut ist. ![]() |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
Blitzard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Übrigens is der Link 404 | ||
User posted image |
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
http://www.igelgames.de/blitzb...lision.htm
habe nett nachgefragt...und schon ne PN bekommen, aber vllt bracuht das ja noch einer. |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
otta |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich poste jetzt einfach mal den Code hier rein weil ein htm file genauso schnell verschwinden kann wie ein zip ![]() Code: [AUSKLAPPEN] ;KOLLISION ; ; ; ;Um eine Kollisionsabfrage in einem 3D-Spiel funktionsfähig hinzukriegen, werden folgende Befehle benötigt: ; ; Entitytype Collisions Countcollisions Entityradius Text Updateworld Renderworld Flip ;Etc. ; ; ; ; ; ;Erst erstellen wir die Kamera und ein Licht: ; ; GRAPHICS3D 640,480 SETBUFFER BACKBUFFER() camera=CREATECAMERA() ROTATEENTITY camera,45,0,0 POSITIONENTITY camera,0,15,-10 light=CREATELIGHT() ROTATEENTITY light,45,0,0 ; ;Diese Befehle müsstest du eigentlich kennen! ; ; ; ;Dann erstellen wir drei Objekte: Eine Kugel, einen Würfel und einen Zylinder:: ; sphere=CREATESPHERE(32) ;Kugel erstellen POSITIONENTITY sphere,0,11,0 ;Positionieren cube=CREATECUBE() ENTITYCOLOR cube,0,100,0 POSITIONENTITY cube,0,-5,0 SCALEENTITY cube,10,10,10 cylinder=CREATECYLINDER(32) ENTITYCOLOR cylinder,255,0,0 POSITIONENTITY cylinder,0,7,0 SCALEENTITY cylinder,2,2,2 ; ;Die Kugel stellt hier den Spieler dar. Jetzt kommen wir zu den neuen Befehlen: ; ;Mit ENTITYTYPE wird dem Objekt ein Typ zugewiesen. Dieser wird nachher bei der kollisionsabfrage noch gebraucht. Also: ; ENTITYTYPE sphere,1 ENTITYTYPE cube,2 ENTITYTYPE cylinder,2 ; ;Der erste Parameter ist das Objekt, der zweite der Typ. Du könntest auch 2642 oder eine x-beliebige Zahl nehmen. Währe aber unübersichtlicher... ; ; ; ;Jetzt müssen wir noch die Reichweite festlegen, d.h., in welcher Entfernung das Objekt kollidiert. Stell dir den Radius wie ein Schutzschild vor. Den Radius legst du mit entityradius fest: ; ENTITYRADIUS sphere,1 ; ;Erster Parameter: Objekt, der zweite ist der Radius! ; ; ; ;Jetzt kommen wir zur Hauptschleife. Mit den Pfeiltasten kann man die Kugel bewegen: ; WHILE NOT KEYDOWN(1) x#=0 y#=0 z#=0 IF KEYDOWN(203)=1 THEN x#=-0.1 IF KEYDOWN(205)=1 THEN x#=0.1 IF KEYDOWN(208)=1 THEN z#=-0.1 IF KEYDOWN(200)=1 THEN z#=0.1 MOVEENTITY sphere,x#,-0.1,z# UPDATEWORLD RENDERWORLD FLIP WEND END ; ; ;Soweit, so gut. Und jetzt kommen wir zur Kollision: ; ; ; ;Wir brauchen einen Befehl, der überprüft, ob zwei Objekte miteinander kollidieren. Der heißt collisions. Er überprüft aber nicht die Kollision zwischen zwei Objekten, sondern zwischen zwei Typen. Die hast du vorher festgelegt (mit entitytype). Der Befehl überprüft also, ob also ein Objekt mit dem einen Typ mit einem Objekt mit dem zweiten Typ kollidiert. Zwei Parameter haben wir schon mal: den ersten (Typ 1) und den zweiten (Typ 2). Als dritter wird die Methode gewählt. Folgende stehen zur auswahl: ; ;1=Kugel-Kugel-Kollision ;2=Kugel-Polygon-Kollision ;3=Kugel-Würfel-Kollision ; ;Diese erkläre ich jetzt nicht, da wir immer den 2. verwenden werden! ; ;Und der vierte Parameter gibt an, was passieren soll, wenn eine Kollision stattfindet! ; ;Folgende Reaktionen stehen zur auswahl: ; ;1=stoppen ;2=sliden (normal) ;3=sliden (nur raufsliden) ; ;Stoppen ist klar. Sliden bedeutet, dass das kollidierende Objekt (Typ 1) sich einen Weg an dem Objekt vorbeisucht. ; ;Wir verwenden nur Parameter 1. Schon haben wir den Befehl collisions erarbeitet: COLLISIONS 1,2,2,1 ;Entspricht: Kollidiert ein Objekt mit Typ 1 (In diesem Fall Kugel) mit einem Objekt mit Typ 2 (in diesem Fall Würfel und Zylinder), und zwar über die Kugel-Polygon-Methode, dann stoppt der Typ 1. ; ; ; ;Das bauen wir jetzt nur noch in die Schleife ein: ; WHILE NOT KEYDOWN(1) x#=0 y#=0 z#=0 IF KEYDOWN(203)=1 THEN x#=-0.1 IF KEYDOWN(205)=1 THEN x#=0.1 IF KEYDOWN(208)=1 THEN z#=-0.1 IF KEYDOWN(200)=1 THEN z#=0.1 MOVEENTITY sphere,x#,-0.1,z# COLLISIONS 1,2,2,2 UPDATEWORLD RENDERWORLD FLIP WEND END ;Ganz wichtig hier aber: Das Updateworld. Nur so wird richtig überprüft. ; ;Jetzt kommt etwas kompliziertes: Der Index-Wert. Natürlich können während eines Schleifendurchlaufs mehrere Kollisionen stattfinden. Jeder Kollision wird eine Nummer zugewiesen. Diese bezeichnet man auch als Index. Die Anzahl der Kollisionen ermittelt man mit countcollisions. Wenn dieser Befehl z.B. 5 zurückgibt, wissen wir, dass 5 Kollisionen stattgefunden haben. Und die erste hat den Index 1, die zweite 2, die dritte 3, die vierte 4 und die fünfte eben 5! Jetzt können wir auch ganz leicht rausfinden, mit welchem Objekt genau die Kugel kollidiert hat: Mit collisionentity. Als Parameter geben wir erstens das Ursprungsobjekt (Typ1 – Kugel) an, und als zweiten den Index. Um auch alle Kollisionen zu erfassen, machen wir das ganze in einer Schleife: ; col=COUNTCOLLISIONS(sphere) TEXT 0,0,"Anzahl Kollisionen: " FOR index=1 TO col TEXT 000,i*20,"Entity="+COLLISIONENTITY(sphere,index) NEXT ;Das Programm sagt sooft, wie es Kollisionen gibt, das jeweilige Objekt. Das bauen wir auch noch in die Hauptschleife ein: ; WHILE NOT KEYDOWN(1) x#=0 y#=0 z#=0 IF KEYDOWN(203)=1 THEN x#=-0.1 IF KEYDOWN(205)=1 THEN x#=0.1 IF KEYDOWN(208)=1 THEN z#=-0.1 IF KEYDOWN(200)=1 THEN z#=0.1 MOVEENTITY sphere,x#,-0.1,z# COLLISIONS 1,2,2,2 UPDATEWORLD RENDERWORLD col=COUNTCOLLISIONS(sphere) TEXT 0,0,"Kollision(en):" FOR i=1 TO col TEXT 000,i*20,"Entity="+COLLISIONENTITY(sphere,i) NEXT FLIP WEND END ; ;Jetzt sind wir fertig. ; ; ; ; ; ;Jetzt könnt ihr das alles in den BB-Editor kopieren und laufen lassen! (Nicht vergessen, das wo die Objekte erstellt werden und der Radius sowie der Typ zugewiesen wird, mitzunehmen!) ; ; ; ;Noch Fragen? Bitte an: fabian.beutel@igelgames.de viel Spaß |
||
AthlonXP 2800+, Radeon 9600XT,160GBHDD,512 MB DDR Ram (neuer Rechner neues Glück;))
Aktuelles Projekt: momentan Projektlos |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group