GSP1 2008-2009 Labo 03 Tree: Parent Child Mesh. Doelstelling Implementatie van View en Projection...

Preview:

Citation preview

GSP1 2008-2009

Labo 03Tree: 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:– Plaats van Oog, Doel, en richting van bovenkant

van camera• DirectX Implementatie:

Projection Matrix

• “Camera kijkhoek”• DirectX SDK Documentatie:

Projection Matrix

• “Camera kijkhoek”• Parameters:– 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:

– 1 Parent– Children: verschillende nodes en/of leafs– World Matrix– Onzichtbaar

• Leaf:– 1 Parent– GEEN Children– World Matrix– Zichtbaar object

Tree

Leaf

Node

Node

Node

Leaf

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.

Leaf1m_World

Node1m_World

Node2m_World

Node3m_World

Leaf2m_World

Leaf1: m_World berekening: (pseudo code)m_World.Translate….Rotate…m_World *= Node2.m_Worldm_World *= Node1.m_World

Leaf2: m_World berekening:

m_World.Translate….Rotate…m_World *= Node3.m_Worldm_World *= Node2.m_Worldm_World *= Node1.m_World

Node1m_World

Node2m_World

Node3m_World

Leaf2m_World

Algoritme:

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 …

•Is afgeleid van de TreeNode•Heeft methods:• Rotate• Translate• Scale•Wordt gebruikt om alle children te:• transleren • roteren• scalen

TreeTransformNode

Tree: Overzicht Klasses

TreeElement

TreeNode TreeD3DObject

TreeTransformNode MultiMesh …

•Is afgeleid van TreeElement(basisklasse)•Is “Leaf” in de boomstructuur•Heeft methods:• Rotate• Translate• Scale•Heeft pure virtual functions:• Tick, Draw, OnResetDevice, OnLostDevice

TreeD3DObject

Tree: Overzicht Klasses

TreeElement

TreeNode TreeD3DObject

TreeTransformNode MultiMesh …

• Is Afgeleid van de TreeD3DObject klasse• Implementeert:– Draw, Tick, OnResetDevice en OnLostDevice– SetMaterialColor(r,g,b,a), Init en Cleanup

MultiMesh

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.

AssenstelselTNode1

Box TNode2

TNodeZ-As

PijlPunt PijlPunt

TNode TNode

Y-As

X-As

Pijlpunt

AssenstelselTNode1

Box TNode2

TNodeZ-As

PijlPunt PijlPunt

TNode TNode

Y-As

X-As

Postioneert het assenstelsel tov de rest van de wereld

Pijlpunt

AssenstelselTNode1

Box TNode2

TNodeZ-As

PijlPunt PijlPunt

TNode TNode

Y-As

X-As

Schaalt en roteert het assenstelsel tov

TNode1

Pijlpunt

AssenstelselTNode1

Box TNode2

TNodeYZ-As

PijlPunt PijlPunt

TNodeX TNodeZ

Y-As

X-As

Roteert tov TNode2 zodat de drie

cylinder-assen correct zijn

georiënteerd

Pijlpunt

Assenstelsel

Z-As

Pijlpunt PijlPunt PijlPuntY-As

X-As

Alle Assen en Pijlpunten:

Enkel een verplaatsing over de eigen z-as is

nodig.

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

Recommended