Labo 03 Tree: Parent Child Mesh GSP1 2008-2009 Labo 03 Tree: Parent Child Mesh
Doelstelling Implementatie van View en Projection matrices Kennismaking met enkele nieuwe klassen uit het 3D Framework. Leren werken met een Tree klassenstructuur Een samengesteld 3D object maken.
View- en Projection Matrix Elk object in de 3D ruimte heeft een positie en rotatie tov de oorsprong -> World Matrix. Om een object vanuit een andere hoek en plaats te bekijken, moet het verplaatst en geroteerd worden->View Matrix. Om perspectief toe te passen (hoe verder een voorwerp, hoe kleiner) gebruiken we een Projection Matrix.
View Matrix “Camera positie en kijkrichting” DirectX SDK Documentatie:
View Matrix Parameters: DirectX Implementatie: Plaats van Oog, Doel, en richting van bovenkant van camera DirectX Implementatie:
Projection Matrix “Camera kijkhoek” DirectX SDK Documentatie:
Projection Matrix “Camera kijkhoek” Parameters: DirectX Implementatie: Kijkhoek, Aspect Ratio, Near en Far Clipping Plane DirectX Implementatie:
Later… Toevoeging van Camera klasse Heeft View en Projection Matrix als datamembers Kan bewegen, translatie en rotatie Kan in- en uitzoomen
Tree Wa t: Een verzameling van objecten met een parent-child relatie. Waarom? Samengestelde objecten: één referentiepunt Voorbeeld: assenstelsel: wat als het zou moeten roteren of rondjes draaien? Vereenvoudigen van rotaties en translaties Optimaliseren van Renderproces (later)
Tree Een Tree heeft Nodes en Leafs (knopen en bladeren) Nodes: Leaf: 1 Parent Children: verschillende nodes en/of leafs World Matrix Onzichtbaar Leaf: GEEN Children Zichtbaar object
Tree Node Node Leaf Leaf Node Leaf Leaf Leaf
Tree: World matrices Elke node en object heeft een World Matrix De World Matrix van een “Leaf” is het product van eigen World matrix met alle Parent World matrices. Voorbeeld: We starten met een object op de oorsprong van het assenstelsel, geen rotatie, geen scale:
Tree: World matrices Het voorwerp wordt geroteerd: Het voorwerp wordt verplaatst:
Voorbeeld World Matrix We volgen m_World: Eerst Initialisatie Vermenigvuldiging met Rotatiematrix Vermenigvuldiging met TranslatieMatrix Enz…. Besluiten: Object komt op positie door opeenvolging van vermenigvuldigingen van eigen World Matrix met andere matrices. Volgorde van vermenigvuldigingen is belangrijk.
Leaf1: m_World berekening: (pseudo code) m_World. Translate… Leaf1: m_World berekening: (pseudo code) m_World.Translate….Rotate… m_World *= Node2.m_World m_World *= Node1.m_World Leaf2: m_World berekening: m_World.Translate….Rotate… m_World *= Node3.m_World m_World *= Node2.m_World m_World *= Node1.m_World Node1 m_World Node2 m_World Leaf1 m_World Node3 m_World Leaf2 m_World
Algoritme: Node1 m_World Node2 m_World Node3 m_World Leaf2 m_World
Tree: Overzicht Klasses TreeElement TreeNode TreeD3DObject TreeTransformNode MultiMesh …
TreeElement Is Basis klasse waaruit de Tree is opgebouwd Datamembers: TreeElement *m_pParent; Is de link met bovenliggend element. D3DXMATRIX m_World; Member functions: GetParent en SetParent, Get- en SetWorldMatrix ResetWorldMatrix CalculateWorldTransform Berekent world matrix adh van alle parent-world matrices. Pure Virtual (moeten door afgeleide klassen worden geïmplementeerd): Draw, Tick, OnLostDevice en OnResetDevice
Tree: Overzicht Klasses TreeElement TreeNode TreeD3DObject TreeTransformNode MultiMesh …
TreeNode Is knooppunt in de boomstructuur Afgeleid van TreeElement: m_pParent,m_World en CalculateWorldTransform Std::vector met Child objecten: Vector<TreeElement*>m_Children Methods Tick, Draw, OnLostDevice en OnResetDevice: Callen van al hun children de method met dezelfde naam. “Onzichtbaar”
Tree: Overzicht Klasses TreeElement TreeNode TreeD3DObject TreeTransformNode MultiMesh …
TreeTransformNode Is afgeleid van de TreeNode Heeft methods: Rotate Translate Scale Wordt gebruikt om alle children te: transleren roteren scalen
Tree: Overzicht Klasses TreeElement TreeNode TreeD3DObject TreeTransformNode MultiMesh …
TreeD3DObject Is afgeleid van TreeElement(basisklasse) Is “Leaf” in de boomstructuur Heeft methods: Rotate Translate Scale Heeft pure virtual functions: Tick, Draw, OnResetDevice, OnLostDevice
Tree: Overzicht Klasses TreeElement TreeNode TreeD3DObject TreeTransformNode MultiMesh …
Is Afgeleid van de TreeD3DObject klasse Implementeert: MultiMesh Is Afgeleid van de TreeD3DObject klasse Implementeert: Draw, Tick, OnResetDevice en OnLostDevice SetMaterialColor(r,g,b,a), Init en Cleanup
Voorbeeld: Assenstelsel Zichtbare componenten: Cubus op oorsprong van assenstelsel 3 cylinders die de assen voorstellen 3 cylinders die de pijlpunten voorstellen
Voorbeeld: Assenstelsel Klasse Is afgeleid van de TreeTransformNode klasse Bevat dus reeds een world matrix, waarmee het object een plaats rotatie en scale kan hebben. Methods: Build() : gebruikt MeshShapes om een assenstelsel te bouwen Cleanup()? NEE: door overerving gaat de TreeTransformNode alle child objecten deleten! Componenten: TransformNode die het geheel nog eens kan transleren roteren en schalen, heeft als children: Drie Transformnodes die de cylinders zo positioneren dat ze de xy en z as voorstellen en een box Elk van de drie transformnodes heeft een as en pijlpunt als children.
Assenstelsel TNode1 Box TNode2 TNode TNode TNode Z-As X-As Y-As PijlPunt PijlPunt Pijlpunt
Postioneert het assenstelsel tov de rest van de wereld TNode1 Postioneert het assenstelsel tov de rest van de wereld Box TNode2 TNode TNode TNode Z-As X-As Y-As PijlPunt PijlPunt Pijlpunt
Schaalt en roteert het assenstelsel tov TNode1 Box TNode2 TNode TNode TNode Z-As X-As Y-As PijlPunt PijlPunt Pijlpunt
Assenstelsel TNode1 Box TNode2 TNodeX TNodeY TNodeZ Z-As X-As Y-As Roteert tov TNode2 zodat de drie cylinder-assen correct zijn georiënteerd Box TNode2 TNodeX TNodeY TNodeZ Z-As X-As Y-As PijlPunt PijlPunt Pijlpunt
Assenstelsel Alle Assen en Pijlpunten: Enkel een verplaatsing over de eigen z-as is nodig. Z-As X-As Y-As PijlPunt PijlPunt Pijlpunt
Opbouw Assenstelsel: Default locatie van de cilinder: Gecentreerd rond middelpunt van de World(zie box) Lengte richting is Z
Opbouw Assenstelsel: Translatie van het MultiMesh Cilinder object op de Z-As
Opbouw Assenstelsel: Aanmaken van TransformNode: Roteert children rond y-as Rode cilinder wordt child
Opbouw Assenstelsel: Toevoegen van Pijlpunt voor x-as Geen translaties Nog niet als child aan Transformnode toegevoegd.
Opbouw Assenstelsel: Translatie van pijlpunt langs z-as. Nog geen child van transformnode
Opbouw Assenstelsel: Pijlpunt toegevoegd aan TreeTransformNode