290 likes | 520 Views
Jaarproject 1e licentie informatica Universiteit Antwerpen 2004-2005 Promotor: Prof. dr. ir. Tom Dhaene Begeleider: Wouter Hendrickx Bram Derkinderen Gert Heiremans Wim van Aarle Jan Vlegels. BrainStorm. Opgave. Visualisatie van modellen opgebouwd uit legoblokken.
E N D
Jaarproject 1e licentie informatica Universiteit Antwerpen 2004-2005 Promotor: Prof. dr. ir. Tom Dhaene Begeleider: Wouter Hendrickx Bram Derkinderen Gert Heiremans Wim van Aarle Jan Vlegels BrainStorm
Opgave • Visualisatie van modellen opgebouwd uit legoblokken. • Onderzoek naar de mogelijkheden met betrekking tot realtime animatie van deze modellen.
DatParser • Zorgt voor de omzetting van een .ldr of .dat file naar een goede brickstructuur. • Voegt voor elke brick de connectoren toe die gevonden worden in de database. • Zorgt ervoor dat de kleuren van de lijnen en vlakken correct zijn. • Optimalisatie: elk blokje wordt slechts 1 maal geparsed en wordt nadien bewaard in een map
LCDManager (1) • Beheert de Ldraw Connection Database • De ingegeven lijnstructuur van bepaalde connectorTypes. • Een weloverwogen selectie van bricks met hun connectoren samen met de relatieve positie en richting van de connectoren. • Een lijst van connectorTypes die op elkaar passen.
LCDManager (2) • Maakt mogelijk om de lijnstuctuur van een bepaald connectorType in te geven met behulp van het “klikalgoritme” en om deze lijnstructuur op te slaan. • Zoekt aan de hand van de manueel ingegeven lijnstructuren van de connectoren, deze connectoren terug in een reeks gegeven bricks.
LCDManager (3) • Het procede dat gebruikt wordt om de connectoren in de bricks terug te vinden werkt goed, maar er zijn ook nadelen: • Vraagt veel rekentijd. • Er zijn in Lego enorm veel connectoren die zeer weinig voorkomen, en dus is het niet de moeite om de lijnen secuur te gaan aanklikken en deze connector in alle bricks te gaan zoeken.
DatLinker (1) • Sorteert de Bricks van de geparste Bricklijst in containers: de BigBricks. • Alle Bricks in een zelfde BigBrick vormen samen een geheel van vast geconnecteerde Bricks. • De BigBricks in een consistent model zijn onderling verbonden door middel van LooseConnections.
DatLinker (2) • Checkt met behulp van de database, gegeneerd door LCDManager, of er tussen 2 Bricks een connectie bestaat, hetzij een vaste, hetzij een losse connectie. • Op basis van het resultaat van bovenstaande checks verdeelt het DatLinker-algoritme de Bricks over de correcte BigBricks.
DatLinker (3) • Probleem 1: Vele queries op de database zijn noodzakelijk, met zéér zware gevolgen voor de prestaties. Enkele optimalisaties werden toegepast. • Probleem 2: Doordat de lijst met geparste Bricks 1 voor 1 doorlopen wordt moet er gemerged worden. Overhead is door optimalisaties grotendeels weggewerkt.
Abstract Brick Structure (ABS) • ModelManager: voorziet alle functies nodig om een model te parsen en te linken. Bevat tevens verwijzingen naar de DatParser en de DatLinker. • Model: brengt alle gegenereerde informatie over een model bijeen. De lijst met geparste Bricks, de lijst met BigBricks en de lijst met motoren.
Abstract Brick Structure (ABS) • BigBrick: een container van Bricks die een vast geconnecteerd geheel vormen. BigBricks zijn onderling verbonden door LooseConnections. • Brick: de basisentiteit van Brainstorm. Alle informatie over een enkele legoblok wordt erin opgeslagen. • LooseConnection: Informatie over de losse connecties tussen 2 BigBricks.
Animator (1) • Animatie van de modellen met behulp van Open Dynamics Engine. Redenen: • De structuur gelijkt erg op onze geavanceerde brickstructuur. • Leek op het eerste gezicht duidelijk gedocumenteerd. • Er zijn enkele mooie voorbeelden van programma’s die ODE gebruiken.
Animator (2) • We werken tijdens de animatie met relatieve coordinaten: we houden steeds de originele positie van de bricks bij en laten ODE een relatieve positie berekenen bij elke animatiestap. Dit voorkomt het exploderen van afrondingsfouten.
Animator - Errorcorrectie • We passen momenteel een zeer grote errorcorrectie toe, namelijk 0,9: • Dit is nodig om alle afrondingsfouten uit ODE te kunnen opvangen. • Dit levert momenteel nergens problemen op in verband met opgeslokte animatiestappen.
Visualisatie • OpenGL • windowmanager: GLUT • Optimalisaties • gl*Pointers • Objecten met relatieve posities
Visualisatie (2) • GUI • GlUI • nieuwe elementen + texturesupport • Menu • Console • ProgressBar • PopupBox • ...
Link met animatie • Na elke update van het de animatiemodule • van elke BigBrick de positie t en rotatie r (quaternion) opvragen uit ODE • Bij elke frame • glRotate(r) en glTranslate(t) voor het tekenen van de BigBrick • glRotate(-r) en glTranslate(-t) na het tekenen van de BigBrick
Link met LCDManager • 3D picking • vraag diepte-waarde uit de buffer van OpenGL op een bepaald punt • onprojecteer punt naar x,y,z waarde • controleer of het punt in een face zit • zoja: bereken zwaartepunt van de face en selecteer de gepaste rechte • op vraag van de gebruiker alle data doorsturen naar de LCDManager
Problemen - DAT • DAT formaat bevat geen connectieinformatie => LCDManager. • Inconsistentie bij het opgeven van vertices. • Backfacelines zijn ongeschikt voor real-time gebruik. • Floats soms in wetenschappelijke notatie opgegeven, soms in fixed-point notatie.
Problemen - LCDmanager • Er bestaan zeer veel speciale Legoblokjes => veel moeten extra hard coden in de LCDManager. • LCDManager is zeer rekenintesief. Duurt enkele dagen om de 96 blokjes, die momenteel ondersteund worden, op te nemen in de database. • SQLite: ondersteunt enkele features niet waardoor query's opstellen en debuggen een tijdrovende zaak wordt.
Problemen - ODE • Motoren in ODE staan in de doc's, maar blijken niet te werken op de manier zoals wij ze nodig hebben • alternatieve oplossingen bestaan, maar staan slecht gedocumenteerd • Doch: nog altijd beter dan alles zelf te schrijven • andere animatielibrary had misschien beter geweest, maar dit bleek niet uit de documentatie en de voorbeelden van ODE
Toekomstbeeld • LCDManager optimaliseren door opgave van de te zoeken connectoren. • LCD uitbreiden met nieuwe blokken en connectoren. • Gelinkte modellen op schijf opslaan. • MLCad verbeteren aan de hand van de Ldraw Connection Database.
Creators: Bram Derkinderen Gert Heiremans Wim van Aarle Jan Vlegels