Avatar billede hairball Nybegynder
11. juni 2001 - 12:56 Der er 11 kommentarer og
1 løsning

Kollision Detektion

Hvis jeg vil vide om 2 GIF\'er (rumskibe eller likewise) rammer hinanden hvordan håndterer jeg så smartest dette ?

Jeg kan naturligvis sammenligne deres position og tage højde for billedets kvadratiske størrelse, men findes den er måde (som ikke æder alt CPU-power) til at lave detektionen helt præcist ned på pixel-niveau ?
Avatar billede escaton Nybegynder
11. juni 2001 - 12:57 #1
hvorfor ikke lave det hele i en gif?
Avatar billede hairball Nybegynder
11. juni 2001 - 13:00 #2
Jeg forstår ikke ?

Jeg snakker om 2 forskellige objekter i et spil som kan ramme hinanden
Avatar billede hoejrup Nybegynder
11. juni 2001 - 13:04 #3
Avatar billede hairball Nybegynder
11. juni 2001 - 13:06 #4
Er det ikke kun 3D der snakkes om der ?
Avatar billede bearhugx Nybegynder
11. juni 2001 - 13:29 #5
Der er to måder at gøre det på ... Den ene er lidt CPU-tung og den anden er mere CPU-tung....

1) som du selv har nævnt - en \'virtuel\' kasse/rektangel omkring skibet .... Denne metode hedder Bounding Box (BB)... Denne er ikke særlig CPU tung, da er der relativt få udregninger, der skal til for at detektere en kollision (hvis to BB\'ere overlapper hinanden, dvs. er inde for samme interval på den ene akse, og også er indefor et fælles interval på den anden akse, så er der en kolission .. DVS. to udregninger - rimligt simpelt...
Problemet med Bounding Box, er at den kan blive urealistisk -den er kun brugbar OG realistisk, hvis skibet fylder HELE BB\'en....

2) den anden metode, er en som jeg kom frem til for et par år siden, som hedder Bit-Masking...

Konceptet går ud på at have en to-dimmesionel array, som er lige så stor, som skærmen/spillearealet. Cellerne i denne array er boolean-værdier.

Efter hver flytning på skærmen resetter du alle værdier i arrayen, så alle cellerne er true...
Derefter tegner du masken for hvert objekt ind - hvor du gør den med XOR....
Samtidig med at du putter masken ind, pixel for pixel - checker du for om den er true eller false, efter du har XOR\'ed cellen ....
  hvis den er false : betyder det, at der ikke har været skrevet til cellen før - ergo er det sikkert for pixelen at være der....
  hvis den er true : betyder det at du lige har overskrevet en anden maske - ergo må det betyde, at to objekter er igang med at kolidere....

Du kan evt. besparre din udregninger ved kun at tegne maskens kontur ind i arrayen .. men dette vil kun virke, hvis objekterne kun flytter sig 1 pixel ad gangen.....

Bit-Masking er en helt realistisk metode - men tung ... Da jeg opdagede den for et par år siden, programmerede jeg i Pascal, som IMHO er hurtigere til at foretage sådanne udregninger.

/Søren Munk Skrøder
Avatar billede hairball Nybegynder
11. juni 2001 - 13:35 #6
Hej Bear

Tak for et godt svar, men puha det lyder tungt :) .. jeg tror jeg lægger ud med en BB ting..

BB er en funktion man selv laver ikke ?
Avatar billede bearhugx Nybegynder
11. juni 2001 - 13:46 #7
Hairball>> ok.... men pas på f.eks. følgende senario --- De rammer _IKKE_ hinanden, selvom deres BB overlapper ....

+-------------+
|***__________|
|*******______|  <<<<---- Skib 1
|*********____|
|************_|
|*********____|
|******__+-------------+
|***_____|____|_____***|
+--------|----+__******|
        |____*********|
        |_************|  <<<<-Skib 2
        |____*********|
        |_______******|
        |__________***|
        +-------------+


Det var denne form for \'urealisme\', som fik mig til at opdage Bit-Masking

(Håber at dette kan ses i svaret ... ellers så prøv at kopiere svaret ind i notepad... hvor der bruges en proporional skrift....

/Søren Munk Skrøder

Avatar billede hoejrup Nybegynder
11. juni 2001 - 13:49 #8
Her kan du læse mere om collision detection:

http://www.realtimerendering.com/#colldet

/per
Avatar billede bearhugx Nybegynder
11. juni 2001 - 13:52 #9
BB-detection kan man programmere selv...
Avatar billede hairball Nybegynder
11. juni 2001 - 14:25 #10
Jeg har selv kodet en del BB selv før i tiden, ville blot høre om det fandtes en predif. methode til det.

Jeg har lavet følgende 2 spil der ligger online

www.idg.dk/virus/
www.idg.dk/flip/
Avatar billede hairball Nybegynder
11. juni 2001 - 14:27 #11
Jeg plejer nogle gange ved BB at lade objektet \"være\" måske 2-3 pixels mindre kvadratisk når kollisionen udregnes, så skal det støde lidt mere sammen for at detekte og det kan virke mere naturligt
Avatar billede warpgiga Nybegynder
22. juni 2001 - 19:36 #12
du kan også evt. lave flere mindre bounding boxes til samme objekt. f.eks en stor til skroget og to mindre til kanoner på fly eller lign.. og så gruppere boxene..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester