RTG-formatet Gustav Taxén,

Relevanta dokument
Spelutveckling 3d-grafik och modellering. Grunder för 3d-grafik Blender Animering

OpenGL, Maya och specialeffekter

Shaders. Gustav Taxén

OpenGL, Maya och specialeffekter

Avalanche Studios. OpenGL. Vår teknik. Våra spel. Lite inspiration... Stora, öppna spelvärldar. Sandbox-gameplay. Hög audiovisuell standard

OpenGL-översikt. OpenGL. Viktigt att komma ihåg: OpenGL-kommandon. OpenGL är en tillståndsmaskin. Transformationer. Geometrispecifikation

OpenGL-översikt. OpenGL. Lokala koordinatsystem. Transformationer. Hierarkiska modeller. Animation. Transformation Byte av koordinatsystem

OpenGL AGI HT05. Gustav Taxén

OpenGL-översikt. Mer OpenGL. Består-av-hierarki. Hierarkiska modeller. Från hierarki till kod, steg 1. Lokala koordinatsystem

Varför behövs grafikbibliotek? Introduktion till OpenGL. OpenGL är ett grafikbibliotek. Fördelar med OpenGL. Allmänt om OpenGL. Nackdelar med OpenGL

Shaders. Renderingssystem. Renderingssystem. Renderingssystem. Hårdvara för 3D-rendering. Hårdvara för 3D-rendering

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Laboration - Shaders

Föreläsning 3.1: Datastrukturer, en översikt

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Övning från förra gången: readword

Kurvor och ytor. Gustav Taxén

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

OpenGL, Maya och specialeffekter

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

Datastrukturer och algoritmer

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

TDIU01 - Programmering i C++, grundkurs

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

En introduktion till OpenGL. Gustav Taxén

Modellering. Gustav Taxén

Arrayer. results

Extramaterial till Matematik Y

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Omtentamen TNM077, 3D datorgrafik och animering (samt även TNM008, 3D datorgrafik och VR)

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Datastrukturer och algoritmer

OpenGL. grafikbibliotek? Nackdelar med OpenGL. Fördelar med OpenGL. En introduktion till OpenGL. OpenGL. rdvara. Grafikhårdvara.

Datastrukturer och algoritmer

Tentamen TEN1 HI

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Tentamen TNM061, 3D-grafik och animering för MT2. Tisdag 3/ kl 8-12 TP51, TP52, TP54, TP56, TP41, TP43. Inga hjälpmedel

Inlämningsuppgift : Finn. 2D1418 Språkteknologi. Christoffer Sabel E-post: csabel@kth.se 1

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Grafiska pipelinen. Edvin Fischer

Tentamen TNM061, 3D-grafik och animering för MT2. Onsdag 20/ kl SP71. Inga hjälpmedel

Kapitel 6. Kapitel 6. Hakparenteser fšr att ange index float[] priser = new float[500]; frekvens[4] boolean[] flaggor;

Skinning and Animation

Innehåll. Mina målsättningar. Vad krävs för att nå dit? Obligatoriska uppgifter. Websajten. Datastrukturer och algoritmer

TANA17 Matematiska beräkningar med Matlab

F5: Högnivåprogrammering

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

För att komma igång. Ta skissen från designlabben eller motsvarande och lägg in den i front/side/top fönstret/fönstrena.

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

F5: Högnivåprogrammering

Import / export av personer i Vaka 2.

Datorteknik 2 (AVR 2)

Kort introduktion till POV-Ray, del 5

tentaplugg.nu av studenter för studenter

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Föreläsning 9 Innehåll

Objektorienterad programmering i Java I

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Detaljbeskrivning av Player

Pekare och arrayer. Indexering och avreferering

Tentamen *:58/ID100V Programmering i C Exempel 3

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Designing a Shading System. David Larsson

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Bedömning för lärande i matematik

Skinning. Ännu fler koordinatsystem att hålla reda på. SUPPLEMENT 2 till "So How Can We Make Them Scream?" 1. Olika metoder för kroppsanimation

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

4 Sammansatta datatyper

Tentamen. DD2385 Programutvecklingsteknik vt 2011 Tisdagen den 24 maj 2011 kl Hjälpmedel: penna, suddgummi, linjal

Uppgifter till praktiska tentan, del A. (7 / 27)

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

Arduinokurs. Kurstillfälle 4

Universe Engine Rapport

Erbjuder studenterna en möjlighet att lära sig grunderna i polygonmodellering, samt erfarenhet av att använda ett modernt 3D-modelleringsverktyg.

Transformationer i 3D. Gustav Taxén

Omtentamen. TNM077 3D-datorgrafik och animering kl 8-12 Inga hjälpmedel. (samt även TNM008 3D-datorgrafik och VR)

Spelutveckling - Scenegrafer. Scenegrafer Optimeringar Culling

Enklast att skriva variabelnamn utan ; innehåll och variabelnamn skrivs ut

surell consulting ab

BILAGA 1 ADVES MANUAL 1 (7)

Mer om geometriska transformationer

Handbok Potatismannen. Éric Bischoff Paul E. Ahlquist, Jr. Eugene Trounev Granskare: Lauri Watts Översättare: Stefan Asserhäll

2D1339 Programkonstruktion för F1, ht 2003

Programmering för språkteknologer II, HT2011. Rum

TAIU07 Matematiska beräkningar med Matlab

Algoritmer, datastrukturer och komplexitet

Enkla datatyper minne

LANDING ZONE IV (v1.0, uppgift 4 av 4) för 3D Animering B 1112

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

Objektorienterad programmering Föreläsning 11. Copyright Mahmud Al Hakim

Bilder till bildspel på TV med Lightroom. Förberedelser

Transkript:

RTG-formatet 2004-08-11 Gustav Taxén, gustavt@nada.kth.se Det här texten beskriver kortfattat RTG-filformatet och ett C-bibliotek som kan läsa det. RTG-formatet är ett filformat för geometribeskrivningar som kan exporteras från t.ex. Maya. Här är ett exempel på hur det kan se ut: HEADER_TITLE Alias Wavefront Rtg Output HEADER_VERSION 4.04 NUMBER_OF_OBJECTS 2 HUVUD OUTPUT_VERT_NORMS OUTPUT_TEX_COORDS on on MATERIAL_LIST 1 MATERIAL 0 NAME lambert1 AMBIENT 0.500000 0.500000 0.500000 MATERIAL- LISTA END_MATERIAL_LIST HIERARCHY_LIST HX 1 top_level 0 P box0 tran: 0.000000 0.000000 0.000000 rot: 0.174533 0.349066 0.523599 scal: 1.000000 1.000000 1.000000 1 P box1 tran: 0.000000-2.910448 0.000000 rot: 0.174533 0.349066 0.523599 scal: 1.000000 1.000000 1.000000 HIERARKI- BESKRIVNING END_HIERARCHY_LIST OBJECT_START box0 v29 n96 t41 p21 USES_MATERIAL 0 lambert1 VERTEX local -0.500000-0.500000 0.500000 0.500000-0.500000 0.500000 NORMAL 0.000000 0.000000 1.000000 0.000000 0.000000 1.000000 TEXCOORD 0.000000 0.000000 1.000000 0.000000 OBJEKT- BESKRIVNING POLYGON v 0 1 2 3 4 5 6 n 0 1 2 3 4 5 6 t 0 1 2 3 4 5 6 v 7 8 9 10 n 7 8 9 10 t 7 8 9 10 OBJECT_END

Alla RTG-filer innehåller ett huvud med flaggor, en materiallista (som kan vara tom), en hierarkibeskrivning (med minst en toppnivå-nod) och, för varje nod i hierarkin, en objektbeskrivning. (Det kan också ingå andra saker, men de här fyra är de mest väsentliga.) Flaggorna beskriver vilken data som finns i filen, bl.a. om polygonhörnen har normal och texturkoordinater. Materiallistan är, som namnet antyder, helt enkelt en lista över de material som används av geometriobjekten i filen. Varje material har ett namn (samma namn som det tilldelats i Maya), parametrar för ljusreflektion (ambient, diffuse, specular, shininess, emission och transparency) och eventuellt en textur. En textur består av ett namn (samma namn som i Maya, kan vara den tomma strängen) och en fil (den fil som laddades i Maya). NOT: Om man inte skapat sitt Maya-projekt på rätt sätt (se Mayalabbpeket) så kan det hända att texturfilnamnet får en absolut sökväg istället för en relativ. Då kan man bli tvungen att gå in och ändra i RTG-filen för hand så att det stämmer. Efter materialen följer en specifikation av de objekt som ingår. Den här hierarkin är väsentligen densamma som i Outliner-fönstret i Maya. Varje nod är antingen en geometrinod eller en grupp. Grupper saknar geometrisk information och finns därför inte med i objektbeskrivningen som följer efter hierarkibeskrivningen. Om Mayas RTGexporter är inställd så att den exporterar transformationer (se Mayalabbpeket) så har också varje nod en transformation: translation (tran), rotation (rot) och skalning (scal). Eftersom kombinationer av transformationer inte är kommutativa är ordningen som man applicerar på dem viktig. Här är korrekt ordning för OpenGL: gltranslatef(tran.x, tran.y, tran.z); glrotatef(radians_to_degrees * rot.x, 1, 0, 0); glrotatef(radians_to_degrees * rot.y, 0, 1, 0); glrotatef(radians_to_degrees * rot.z, 0, 0, 1); glscalef(scal.x, scal.y, scal.z); NOT: Observera att varje transformation är i förhållande till föräldernoden. Efter hierarkibeskrivningen följer geometriska data för alla noder som inte är gruppnoder. Varje sådant avsnitt börjar med nodens namn (samma som i hierarkibeskrivningen, box0 i exemplet på förra sidan) och antalet positioner, normaler, texturkoordinater och polygoner. Sedan listas alla positioner (VERTEX), normaler (NORMAL) och texturkoordinater (TEXCOORD). Därefter följer polygonerna; varje polygon indexerar listorna ( v för positioner, n för normaler och t för texturkoordinater). I exemplet ovan är alltså den första polygonen en sjuhörning vars första hörn sitter i positionen [-0.5, -0.5, 0.5], med normal [0, 0, 1] och texturkoordinat [0, 0]. Den andra polygonen är en fyrhörning.

I katalogen /info/aginn/opengl där nn är nuvarande läsår finns ett bibliotek som kan tolka RTG-filer. Biblioteket innehåller två funktioner, RTG_Parse() och RTG_Free() samt en mindre mängd datastrukturer. RTG_Parse() används för att ladda en RTG-fil och RTG_Free() används för att släppa det minne som upptas av de datastrukturer som RTG_Parse() skapar. Så här används de: #include <RTGlib.h> RTGFile *file = RTG_Parse( minfil.rtg, 1); RTGFree(file); Ettan som skickas med till RTG_Parse() talar om att statusinformation ska skrivas ut under tiden filen tolkas. Om du inte vill se statusinformationen, skicka med en nolla istället. Datastrukturerna i RTG-biblioteket ser ut så här: /* RTG-fil med lista med toppnivånoder och lista med material */ struct RTGFile { RTGNode *nodes[]; // Lista med noder unsigned int nnodes; // Antal noder RTGMaterial *mat[]; // Lista med material unsigned int nmat; // Antal material ; /* En RTG-nod med barn, ev. geometridata och transformationsinfo */ struct RTGNode { struct RTGNode *children[]; // Lista med barn till denna nod unsigned int nchildren; // Antal barn RTGObject *obj; // Geometriinfo (kan vara NULL) char *objname; // Nodens namn RTGVec3 trn; // Translation RTGVec3 rot; // Rotation RTGVec3 scl; // Skalning ; /* Tredimensionell vektor */ struct RTGVec3 { float x; float y; float z; ; /* Tvådimensionell vektor */ struct RTGVec2 { float x; float y; ;

/* Geometridata med materialindex, positioner, * normaler, texturkoordinater och polygoner */ struct RTGObject { char *name; unsigned int mat; // Index för materialet RTGVec3 *pos; // Lista med positioner unsigned int npos; // Antal positioner RTGVec3 *norm; // Lista med normaler unsigned int nnorm; // Antal normaler RTGVec2 *tex; // Lista med texturkoordinater unsigned int ntex; // Antal texturkoordinater RTGPolygon *poly[]; // Lista med polygoner unsigned int npoly; // Antal polygoner ; /* En polygon med en lista med hörn */ struct RTGPolygon { RTGVertex *v; // Lista med hörn unsigned int nvert; // Antal hörn ; /* Polygonhörn med index till positon-, normal- och * texturkoordinatslistorna */ struct RTGVertex { unsigned int p; // Index för positionen unsigned int n; // Index för normalen unsigned int t; // Index för texturkoordinaten ; /* Ett material med namn, reflektionsegenskaper och texturinfo */ struct RTGMaterial { char *name; // Materialets namn float amb[3]; // Ambient float dif[3]; // Diffuse float spc[3]; // Specular float shn; // Shininess (cosinus-exponent i Phong-modellen) float em[3]; // Emission ( incandescence i Maya) float trp; // Transparency char *texname; // Texturnamn (kan vara NULL) char *texfile; // Texturfil (kan vara NULL) ; Som man kan vänta sig är mappningen mellan Maya-shaders och RTG-material icketrivial. Mayas Phong-material är att föredra (ger mest lika resultat), medan Blinn, Lambert och de andra materialtyperna kan ge oväntade mappningar (eller inte funka alls). Om Maya-materialet har en textur sätter Mayas RTG-exporter dif till [0, 0, 0]. Logiken bakom detta är att diffuse-värdena i Maya ersätts av texturvärdena. Tyvärr funkar inte detta tänk i OpenGL där man oftast vill använda GL_MODULATE som parameter till gltexenv(), så RTG-biblioteket sätter dif till [1, 1, 1] då materialet har textur. Emission-parametern i RTG-filen är kopplad till Maya-materialens incandescenceparameter och har inget med Maya-ljuskällor att göra.

Att gå igenom en RTGFile-struktur som lästs in med RTG_Parse() är inte särskilt komplicerat (kodsnutten finns som textfil i /info/agi-katalogen): void draw(rtgfile *file) { unsigned int i; // Rita alla toppnivånoder for (i = 0; i < file->nnodes; i++) { drawnode(file->nodes[i]); void drawnode(rtgfile *file, RTGNode *node) { unsigned int i; glpushmatrix(); applicera transformation (se ovan); // Om noden har geometri, rita den if (node->obj) { drawobject(file, node->obj); // Om noden har barn, rita dem for (i = 0; i < node->nchildren; i++) { drawnode(file, node->children[i]); glpopmatrix(); void drawobject(rtgfile *file, RTGObject *obj) { unsigned int i, j; RTGVertex *v; RTGVec3 *n; RTGVec3 *p; RTGVec2 *t; setmaterial(file->mat[obj->mat]); for (i = 0; i < obj->npoly; i++) { glbegin(gl_polygon); for (j = 0; j < obj->poly[i]->nvert; j++) { v = &obj->poly[i]->v[j]; n = &obj->norm[v->n]; t = &obj->tex[v->t]; p = &obj->pos[v->p]; glnormal3f(n->x, n->y, n->z); gltexcoord2f(t->x, t->y); glvertex3f(p->x, p->y, p->z); glend(); void setmaterial(rtgmaterial *mat) {