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?