Avatar billede lauritsen Nybegynder
05. juli 2005 - 19:59 Der er 3 kommentarer og
1 løsning

Unøjagtigheder i simpel 3D-implementering

Jeg har skrevet en simpel 3D-wireframe-engine, hvor jeg har implementeret translation, skalering og rotering vha. standard-matricerne for transformering (beskrevet på fx http://gpwiki.org/index.php/3D:Matrix_Math ). Koordinaterne har jeg implementeret som floating-point-variabler (doubles i Java), der bliver opdateret, hver gang der sker en transformering.

Men hvis jeg fx laver en boks, så bliver den langsomt skæv efterhånden som der bliver lavet flere og flere transformeringer. Dette tyder jo på, at problemet skyldes afrundingsfejl, men jeg ved ikke helt, hvordan jeg skal løse det.

Her er en Java-applet, der viser problemet: Efter lidt tid bliver terningerne, der roterer om Y-aksen, smallere ad X- og Z-aksen, så de ser alt for høje ud. Den midterste terning, der roterer om både X-, Y- og Z-aksen, bliver mindre ad alle akser:
http://inducks.org/temp/threedee/

Jeg har tænkt på istedet at registrere et objekts start-koordinater (og så aldrig ændre på dem) samt de aktuelle værdier for translation, skalering og rotering, og så regne de aktuelle koordinater ud fra det. Men så skal jeg jo tage højde for alle typer transformering, hver gang jeg udfører en enkelt slags (hvis der fx tidligere er roteret, skal denne rotation tages med i beregningerne under en senere skalering), og så begrænser jeg mig selv kraftigt, i og med at jeg så ikke kan holde rækkefølgen på transformeringerne (translation, rotation, translation er fx ikke det samme som rotation, translation, translation -- med de samme værdier).

Dette nye problem kunne så igen løses ved, at man husker på hele serien af transformeringer, der er udført, men så begynder det for alvor at blive tungt at beregne...

Nogen go'e idéer?
Avatar billede arne_v Ekspert
05. juli 2005 - 20:11 #1
umiddelbart synes jeg ikke at du skulle få synlige afrundings fejl før efter rigtigt
mange beregninger

forudsat at du regner videre på dine doubles og ikke ikke henter de int værdier
som du er nødt til at bruge ved selve visningen)
Avatar billede tuxic Nybegynder
05. juli 2005 - 21:09 #2
Det er en afrundingsfejl. Hvis du kører appletten længe nok bliver kassen til et punkt. Det er nok bedre at huske start koordinaterne og så opstille en transformationsmatrix der transformerer kassen passende. Du behøver ikke huske serien af transformeringer eksplicit. Hvad med fx at gange matricerne sammen :)
Avatar billede lauritsen Nybegynder
06. juli 2005 - 19:23 #3
arne_v: appletten opdateres også 10000 gange (med knapt 25 opdateringer pr. sekund), så med indtil flere transformeringer pr. opdatering bliver det igrunden også til en del beregninger. Og jo, jeg regnede videre på double-værdierne og konverterede først til ind i det øjeblik, jeg tegnede en linie på skærmen.

tuxic: Ah ja, selvfølgelig. Så holder jeg styr på de oprindelige koordinater og en "aktuel transformeringsmatrice", som er resultatet af alle de udførte transformeringers matricer ganget sammen i rækkefølge. Når der så skal tegnes, ganges transformeringsmatricen så blot på matricen med de oprindelige koordinater. Først var jeg bange for, at afrundingsfejlene bare ville ophobe sig i transformeringsmatricen istedet, men det ser det faktisk ikke ud til, at de gør.

tuxic, hvis du vil ha' pointsne, så gi' et svar :-)
Avatar billede tuxic Nybegynder
06. juli 2005 - 22:37 #4
Ok :) Det er altid en fornøjelse at kunne hjælpe.

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