Avatar billede zaknafein Praktikant
09. december 2005 - 17:24 Der er 5 kommentarer og
1 løsning

2 Vektores indbyrdes retning

i mangel af matematik kategori ligger jeg det her.

Mine objekter er representeret ved en velocity vektor, og et x og y koordinat.

For at lave collision check og respons, skal jeg finde ud af 2 objekters indbyrder retning.

Dvs når objekter overlapper, skal jeg finde ud af om de er på vej væk fra hinanden, da en ny collision så ikke skal triggeres..

DOT produktet af de 2 vektorer vil afsløre om de vektorer ligger på samme side eller modsatte side af et plan.
Hvis resultatet er negativt ved jeg de er modsatrettede, men der er 2 muligheder for modsatrettet: Mod hinanden elle væk fra hinanden.
Og det er det jeg skal vide.

Der må være en vektor funktion eller kombinationer af dem der kan checke dette.
Så jeg ikke skal ud i at checke alle kombanitioner af deres vektorkomponenter for at se om de er negative eller positive.
Avatar billede jpk Nybegynder
11. december 2005 - 00:04 #1
Er det i 2D eller 3D?

Du skriver "et x og y koordinat" hvilket er 2 dimensioner.
Du skriver "samme side eller modsatte side af et plan" hvilket betyder 3 (eller flere) dimensioner.

Kan objekterne krydse hinanden siden de kan være over hinanden samtidig med de er på vej væk fra hinanden?
Avatar billede zaknafein Praktikant
11. december 2005 - 00:58 #2
Hej.
Det er 2d, så betragt z komponenten som 0.
Der er tale om spheres som har en masse.

Ja de kan overlappe hinanden i det tilfælde at de i forrige frame, var meget tæt men ikke nok til at trigger en collision. Så vil de i næste frame overlappe hinanden. Det man så normalt gør at at backtracke og regne ud hvornår de ramte, flytte dem tilbage til det punkt hvor de nøjagtigt ikke rammer, og bruge det resterende tid af nuværenden frame til at lave impact simulering og bounce dem.
Det virker også perfekt mht energi bevarelse af momentum baseret på fart og masse.

Men det jeg skal bruge er en måde at finde ud af om en kollision er triggered for 2 objekter, helst uden at gemme ekstra information.
Dvs udelukkende ud fra deres positioner og movement vektorer.

Dot produktet vil afsløre om deres vektorer er ensrettede eller modsatrettede.
Men hvis de er modsatrettede men på vej væk fra hinanden, skal kollisionen ikke triggeres igen. Kun hvis de er modsatrettede og på vej ind i hinanden. (Collision response vil jo sørge for de i næste frame ikke længere er på vej mod hinanden)

Hvis de er ensrettede, så skal kollisionen fx heller ikke triggeres hvis det "foreste" objekt har mere fart på end det "bagerste", da den så er på vej ud af kollisionen, og derved er håndteret af impulse effekten.

Men der er mange speciel-tilfælde og det er grimt at hack'e sig ud af det med en stak if sætninger, da specielle tilfælde sikkert ikke vil virke.
Avatar billede zaknafein Praktikant
11. december 2005 - 01:15 #3
Lige for at mindske forvirringen om at jeg har lavet en løsning der virker:
Den løsning jeg har lavet med at rewinde tiden og lave response derfra virker perfekt i alle henseender.

Men der er nogle tilfælde hvor jeg ikke må røre ved objekters koordinater, både fordi der er en bunke collisions der skal udføres sekventielt, og stemme overens med en anden kollisions liste på en anden server.

Der er en object / proxy relation på alle serverene. På den ene server kan et owner objekt kollidere med et proxy objekt (som serveren ikke kan kontrollere). På de andre servere er rollen byttet om.
Avatar billede jpk Nybegynder
11. december 2005 - 11:02 #4
Er det en 3D engine du bruger (hvor du har sat z=0) siden du snakker om z-komponent og spheres?
Eller drejer det sig om cirkler? (ikke at det gør den store forskel, men blot for forståelsens skyld)

Hvis din kollision altid kun varer én frame er det okay ikke at gemme information om kolliderende objekter, men ellers kan det blive noget værre bøvl...
(og umulig hvis du har tilfældige kræfter til at virke på dine objekter)

Den nemmeste metode til at se om 2 objekter nærmer sig hinanden eller flytter sig fra hinanden er at simulere et move og sammenholde objekternes positioner med de nuværende.
Du behøver ikke ændre på objekternes egentlige positioner, men blot lave udregningen.
Fx:

d1 = dist(O1, O2)
d2 = dist(simmove(O1), simmove(O2))
away = d1 < d2
Avatar billede zaknafein Praktikant
11. december 2005 - 16:04 #5
Ja den løsning ser ud til at virke...
Der vil måske være nogle tilfæde hvor den ikke virker, fx hvis 2 objekter snitter hinanden. Så vil en simulering af næste skridt få dem til at være længere fra hinanden, men det er godt nok til formålet.

De steder hvor jeg ikke kan bruge den "ægte" algoritme kan denne metode med fordel anvender, da der alligevel ikke kræves så stor præcision, da det er en proxy owner kollision, hvor 2 srvere kan have en smule uoverensstemmelser hvor deres objekter faktisk befinder sig.
Bare smid et svar.
Avatar billede jpk Nybegynder
11. december 2005 - 16:40 #6
Okay, held og lykke med det...
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