3D Collision på boxe

Tags:    delphi ajax

<< < 12 > >>
Jeg er igang med at lave et 3D program med OpenGL, til det har jeg en liste med boxe (med X, Y, Z, brede, højde, dybde). Jeg skal nu teste om man er inde i en af boxene, til det ønsker jeg mig en let måde at se om man er inde i den. (Man er nærmest også selv en box)

Håber der er nogle der har det jeg skal bruge :) Noget i ikke forstår så spørg læs :D

---
Hilsen Anders

P.S. Den skal virke ordenligt :)



11 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Jeg er igang med at lave et 3D program med OpenGL, til det har jeg en liste med boxe (med X, Y, Z, brede, højde, dybde). Jeg skal nu teste om man er inde i en af boxene, til det ønsker jeg mig en let måde at se om man er inde i den. (Man er nærmest også selv en box)

Nu ved jeg ikke noget om OpenGL, men den umiddelbare løsning er vel og se om ens position er mellem x og x+brede OG mellem y og y+højde OG mellem z og z+dybde. Er der ikke en funktion i OpenGL til at checke den slags?

/data



Jeg er igang med at lave et 3D program med OpenGL, til det har jeg en liste med boxe (med X, Y, Z, brede, højde, dybde). Jeg skal nu teste om man er inde i en af boxene, til det ønsker jeg mig en let måde at se om man er inde i den. (Man er nærmest også selv en box)
Nu ved jeg ikke noget om OpenGL, men den umiddelbare løsning er vel og se om ens position er mellem x og x+brede OG mellem y og y+højde OG mellem z og z+dybde. Er der ikke en funktion i OpenGL til at checke den slags?

/data


Tror ikke OpenGL lige har noget. Det du skrev, er umiddelbart rigtigt, problemmet er bare at man ikke er en flad ting, men en boks også. Det du har skrevet check om et punkt er inden for. Jeg kan selfølgelig skrive en masse if's, men håber på en nemmere løsning.

---
Hilsen Anders



Jeg tror desværre du bliver nødt til at lave disse if'er med mindre du vil gå i gang med den hårde matematik om vektorer og planer i rummet og skæringer mellem disse. Det kan godt være at matematikken er hård, men at lave sådan noget matematik om til Delphi kan os være en hård nød at knække, men kig her: http://nehe.gamedev.net/lesson.asp?index=06

Nederst i tutorial 30 er der kolissionsdetektering og held og lykke :)

mvh
Casper Steinmann



Jeg tror desværre du bliver nødt til at lave disse if'er med mindre du vil gå i gang med den hårde matematik om vektorer og planer i rummet og skæringer mellem disse. Det kan godt være at matematikken er hård, men at lave sådan noget matematik om til Delphi kan os være en hård nød at knække, men kig her: http://nehe.gamedev.net/lesson.asp?index=06

Nederst i tutorial 30 er der kolissionsdetektering og held og lykke :)

mvh
Casper Steinmann


Ja, den side kender jeg, men efter hvad jeg kan se er det med kugler, og ikke firekanter :) Nogle der har et sted hvor det er med firekanter? (Har ikke imod at se på lidt avanceret matematik, hvis der er nogle der har noget)

---
Hilsen Anders



Ja, den side kender jeg, men efter hvad jeg kan se er det med kugler, og ikke firekanter :) Nogle der har et sted hvor det er med firekanter? (Har ikke imod at se på lidt avanceret matematik, hvis der er nogle der har noget)

Nu kommer jeg pludselig i tvivl om hvad du mener. Vil du checke om en kasse er helt inde i en anden kasse, eller vil du checke om kasserne er stødt ind i hinanden (en del af den ene kasse er inden i den anden kasse)?

/data




Ja, den side kender jeg, men efter hvad jeg kan se er det med kugler, og ikke firekanter :) Nogle der har et sted hvor det er med firekanter? (Har ikke imod at se på lidt avanceret matematik, hvis der er nogle der har noget)
Nu kommer jeg pludselig i tvivl om hvad du mener. Vil du checke om en kasse er helt inde i en anden kasse, eller vil du checke om kasserne er stødt ind i hinanden (en del af den ene kasse er inden i den anden kasse)?

/data


Kun om lidt af den er støt ind i (må self også være det hele). Håber nogle kan hjælpe :)

---
Hilsen Anders



Jeg vil anbefale dig at kigge lidt på Blender, som er blevet et openSource projekt.
Det er et godt 3D program, og du kan få en idé om hvorledes det gøres...
http://www.blender.org/



Jeg vil anbefale dig at kigge lidt på Blender, som er blevet et openSource projekt.
Det er et godt 3D program, og du kan få en idé om hvorledes det gøres...
http://www.blender.org/


Jeg kan ikke lige finde det jeg leder efter på siden. Er der ikke nogle der har et link til en tut, eller bare noget kode ( eller beskrivelse af hvordan det gøres).

---
Hilsen Anders



Jeg kan beskrivelsen:

Hvis du har en kasse der er defineret vha. 6 planer i rummet, så ved du også hvilke tal(koordinater (x, y, z)) der ligger inde kassen og hvilke der ikke gør. Lad os for sjov skyld kalde disse tal i hver kasse for mængder. Når et koordinat fra den ene mængde ligger i den anden mængde, de deler et eller flere koordinater - altså delmængde, så ved du at kasserne er inde i hinanden. Problemet er så bare at der i 3D – og matematikkens verden er uendeligt mange koordinater i OpenGL verdenen. Så det bliver noget tungt stads kan du nok se. Men der er hjælp på vej, som jeg skrev, skal du kontrollere og de 6 planer som en kube er givet ved, skærer hinanden. Desværre kan jeg ikke hjælpe dig da vi ikke er nået så langt endnu i matematik. Men du kan jo starte med noget nemt og 2D, nemlig hvornår 2 linier på skærer hinanden: (Eksemplet er givet med en normal form men kan uden videre bruges) Desuden skal du huske på, når du går over til 3D, at planer i rummet består af 4 linier, eller 2x2 parallelle…

<pre>
//Linierne skal være givet på formen ax+by=c

//Linierne l og m er givet ved:
// l: 2x-y=5
// m: x+3y=6

type
TPunkt = record
x, y: single;
end;

var
//Determinanterne
hDet, xDet, yDet: single;

//Resultaterne, hvis der er nogle:
Punkt: TPunkt;

{...}

function RegnDet(n1, n2, m1, m2: single): single;
begin
Result := n1 * m2 - m1 * n2;
end;

function GivSkaering(a1, a2, b1, b2, c1, c2: single): TPunkt;
begin
//først skal du regne hoveddeterminanten ud men husk: hvis
//den er 0, så skærer linierne ikke hinanden og derfor kan
//du ikke regne videre med den!
//det er fordi du senere kommer til at dividere
//med 0 og det må man ik! :)
hDet := RegnDet(a1, a2, b1, b2); //Dette giver 7

//Allerede her kan du kontrollere om de
//skærer hinanden
if hDet = 0 then
Exit;

//Herunder regner du skæringspunktet mellem linierne

//Så skal du regne Determinantet for x-koordinatet ud
//og den kommer her:
xDet := RegnDet(c1, c2, b1, b2); //Dette giver 21

//Så skal du regne Determinantet for x-koordinatet ud
//og den kommer her:
yDet := RegnDet(a1, a2, c1, c2); //Dette giver 7

Result.x := xDet / hDet;
Result.y := yDet / hDet;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Punkt := GivSkaering(2.0, 1.0, -1.0, 3.0, 5.0, 6.0);
Caption := 'x: ' +FloatToStr(Punkt.x) +' y: ' +FloatToStr(Punkt.y) //Resultatet er (3, 1)
end;

</pre>




he he... Hej drenge. Ja, 3D kan hurtigt blive noget kryptisk noget! Hemmeligheden bag 3D er MATRIX (altså ikke filmen men den matematiske udtryk for at beregne med Matrix).

Ofte kan man lade OpenGL tage sig af de hårde beregninger ved hjælp af glPushMatrix, glPopMatrix, glMatrixMode og glGetFloatv ellers må du selv til at have olie på hænderne og lade din stakkels stressede CPU tage sig af problemerne på den gammeldags måde. Men kan dit Grafikkort (GPU'en) klare problemet så for guds skyld lad den endelig gøre det!

Hvis du ikke rigtigt kender til at beregne med Matrix, vil jeg på det kraftigeste anbefale dig at lære det! Problemet med Matrix'en er at det er en lidt mere komplex måde at beregne på og kan derfor hurtig slide din CPU ned!

Inden du går til et problem vedrørende 3D bør du forberede dig på at tænke kreativt. Alene kan Sinus & Cosinus gøre ufattelig meget. Så først vil jeg råde dig til at tænke præcis, hvad det er du vil med din "kollisions detekter". Skal dine Boxe (kasser) kunne roteres i dit koordinat system - hvis ja, er det dem begge osv. Og der ud fra lave en matematisk fremgangs måde.

Håber det kunne give dig inspiration til at komme videre!

Held og Lykke
ZeroHero



<< < 12 > >>
t