[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: God sommer!
On Thu, 10 Jun 1999, Mathias Mølster Lidal wrote:
> On Wed, Jun 09, 1999 at 09:22:09AM +0200, Anders Reggestad wrote:
> >
> > Når jeg er ferdig med den luerer jeg på om jeg skal se på bevegelser. Det
> > var noen som begynte å se på dette! Kom de frem til noe? I første omgang
> > tenkte jeg å få et punkt til å følge en overflate. Finne z høyder for en
> > gitt posisjon (x,y) for et vilkårlig geometri objekt.
> >
> Eg har tenkt litt på dette og kom frem til at ein måte er å heile tida holde
> kontroll med kva polygon ein person står på og interpolere høgden utfrå
> koordinata til endepunkta til polygonet
Det å finne det riktige polygon er den vanskligste biten. Å finne høyden
er lett ut fra plan ligningen a*x+b*y+c*z+d=0 der (a,b,c) er en
normalvektor på planet og d er avstanden fra origo til planet. Bytter litt
om og får z=(d-a*x-b*y)/c.
Da var det problemet med å finne riktige polygoner. Basis opperasjon i
første omgang må være å sammenligne høydeforskellen på det punket en
flytter fra til det nye punktet. Da ønsker en å få en liste over alle
høydene på det nye punktet slik at en lett kan sjekke om det finnes en
høyde som er innenfor det som er lovlig når en beveger seg. En kan da også
bruke denne informasjonen til å avgjøre om det er andre plan som hindrer
en i å bevege seg. Hvis en ikke skal lagre mye informasjon fra forje gang
eller ha mye prekalkulert informasjon i datastrukturen så kan jeg tenke
meg følgende algoritme: Føst gjøre en overordnet søk på bbox nivå. Dette
kan også avgrenses i z retning. Det er dåg ikke nødvendig å vite høyden
til skyene hvis en skal gå på bakken, eller nede i en tunnel. Nå vet vi om
vi vilke flater vi er i hærheten av. Da må det avgjøres om vi virklig er
over flaten. Dette kan gjøres med å lage et bsb tre hvor en bruker hver
side på flaten plus z-aksen til å lage planligninger som står vertikalt.
Da får en for et triangel en trekantet søyle (bsd tree) som lett gir svar
på om en er over eller ikke. Det elegante her er at en kan bruke samme
algoritme på triangler,quads og polygons. Dessuten så trenger en ikke å
lage bsd treet men en kan teste på nodene etter hvert som en genererer de
og så forkaste de.
Neste problem er at objektene ofte er rotert slik at ikke lokalt koordinat
system peker nedover langs -z aksen. Dette betyr at algoritmen må lages
slik at den finner skjæringspunkt for en vilkårlig linje med objektet.
Linjen er gitt av en rettningsvektor v=(u,v,w) og et punkt p0=(x0,y0,z0)
{L=t*v+p0}. Dette gir litt omregning av planligningen.
t=-(a*x0+b*y0+c*z0+d)/(a*u+b*v+c*w); Som med unit vektorer er avtanden fra
planet til punktet p0. BSD tree kan konstrueres ut fra vektoren v og
sidene i flaten.
Problemet her er at det er vanskliger å gjøre en forhåndsortering av
hvilke flater vi skal teste nøye. Når vi var langs en av aksene er
bbox svært effektive. Kunne vi bruke bsphere på en fornuftig måte. bsphere
er gitt av (x,y,z,r). Det er en del regning for å avgjøre om linjen vår
skjærer denne kulen, er det vært det? Dette må det forskes litt på!
Tror dette er det beste vi kan gjøre. Da er eneste spørsmål hvor mye info
som skal/kan kalkuleres på forhånd. Tenkte å legge denne funksjonen inn i
CGeometry som
///////////////////////////////////////////////////////////////////////////
// Info : Calculate distances from a point p in the direction given by v.
// min and max give minimum and maximum distances that are to be
// stored in result.
// Return: Table of distances
double* CGeometry::distances(const CVector & v,const CPoint & p,
double min, double max);
Kan være an en lager CBeam(CPoint,CVector) slik at det blir lettere å
gjøre transformasjoner for å finne frem til riktig stråle for forskellige
objekter. beam = object.getTransform().multipy(beam); (Tror dette blir
riktig ^- returnerer en matrise. )
Da blir i så fall
double * CGeometry::distances(const CBeam & b,double min,double max);
Vet ikke hvor mange slike spesial objekter vi bør lage? Koden kan bli
veldig ryddig å lese, men det blir fort mange funksjoner som må skrives
for å kunne regne/bruke disse på en fornuftig måte.
-Anders
----------------------------------------------------------------------
| ****** Anders Reggestad |
| * * * Mobil tlf. : 95044443 |
| * * * E-Mail : andersr@pvv.ntnu.no |
| ********* Post adresse : Haug Prestegård 3300 Hokksund |
| * * * Jobb adresse : FFI avdeling for Undervannsforsvar Horten |
| * * * Hjemmeside : http://www.pvv.ntnu.no/~andersr |
----------------------------------------------------------------------