1. Charakteranimation 2. PlugIns schreiben und laden Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung WS 2010/2011.

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmentheorie 08 – Dynamische Programmierung (1)
Advertisements

der Universität Oldenburg
Imperative Programmierung
Klassen - Verkettete Liste -
Forschungszentrum caesar
Sortieren I - Bubblesort -
der Universität Oldenburg
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Dynamischer Speicher und Struktur
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
V AdresseWert public static void main(...){ int[] v; v=new int[2]; } Was veranlasst diese Anweisung im Arbeitsspeicher ? Es wird im Arbeitsspeicher.
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Dynamische Programmierung (2) Matrixkettenprodukt
WS Algorithmentheorie 08 – Dynamische Programmierung (2) Matrixkettenprodukt Prof. Dr. Th. Ottmann.
Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung Softwaretechnologie II (Teil 2): Simulation und 3D Programmierung Prof.
V03 Laden und Speichern von Spielfeldern und der Spielfeldeditor.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Imperative Programmierung Funktionen und Parameter
Diskrete Mathematik I Vorlesung Arrays-
Zusammenfassung Vorwoche
Einführung in Visual C++
3D Programmierung Version 12 - Highscores. Die vom Spieler erzielte Punktzahl wird mit 5 vorgegebenen Punktzahlen verglichen und, falls nötig, in die.
Java programmieren mit JavaKara
Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung Prof. Dr. Manfred Thaller AM 3 Übung: Softwaretechnologie.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
3D- Spieleprogrammierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung Softwaretechnologie II (Teil I): Simulation und 3D Programmierung Prof.
Game Development mit LUA Integration und Kommunikation von LUA mit C++ Referat von Paul van Hemmen Seminar: Reusable Content in 3D und Simulationssystemen.
Wasser in 3D Die Modellierung und realitätsnahe Echtzeitberechnung von Wasser unter Zuhilfenahme der Grafik Engine OGRE 3D Präsentation von Paul van Hemmen.
Von der Planung bis zum Hauptmenü Seminar: Softwaretechnologie II Dozent: Prof. Manfred Thaller Referent: Jan Bigalke.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung
Einführung in die Programmiersprache C 4
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
PHP Basic.
Programmbereich, zu dem eine Deklaration gehört Arten von Gültigkeitsbereichen -Namespace : Deklarationen von Klassen, Interfaces, Structs, Enums, Delegates.
Purga - Scriptengine Ein Einblick.
Objectives Verstehen was unterDelegate verstanden wird
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
BMEVIEEA100 Grundlagen der Programmierung
Parallelisierung für Multiprozessor-Maschinen
Unity 4.x Cookbook Softwaretechnologie II (Teil 2) - Maximilian Berndt.
ANIMATION II Universität zu Köln Historisch Kulturwissenschaftliche Informationsverarbeitung SS 2013 Softwaretechnologie II (Teil II): Simulation und 3D.
Das erste Spiel Universität zu Köln
A) Erklären Sie den Datentyp char. b) Erklären Sie den Datentyp Struct c) Erklären Sie die Wirkungsweise des Operators & bei Anwendung im Zusammenhang.
Breakanoid – Bälle & Blöcke Universität zu Köln Historisch Kulturwissenschaftliche Informationsverarbeitung WS 12/13 Übung: Visuelle Programmierung I –
Die Welt der Shader Universität zu Köln WS 14/15 Softwaretechnologie II (Teil 1) Prof. Dr. Manfred Thaller Referent: Lukas Kley Fortgeschrittene Techniken.
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
Historisch-Kulturwissenschaftliche Informationsverarbeitung Übung: Softwaretechnologie II / Visuelle Programmierung Dozent: Prof. Dr. Manfred Thaller WS.
Einführung in die Programmierung mit Java
Pool Informatik, Sj 11/12 GZG FN W.Seyboldt 1 Pool Informatik 5 GZG FN Sj. 11/12 Kopieren, Daten, Programme.
Game Loop & Update Method Robert Nystrom – Game Programming Patterns Universität zu Köln Historisch-Kulturwissenschaftliche Informationsverarbeitung SS.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
Implementieren von Klassen
 Präsentation transkript:

1. Charakteranimation 2. PlugIns schreiben und laden Universität zu Köln Institut für Historisch-Kulturwissenschaftliche Informationsverarbeitung WS 2010/2011 Prof. Dr. Manfred Thaller AM 3 Übung: Softwaretechnologie II Teil 1: Simulation und 3D-Programmierung Referent: Martin Kolodziej

Charakteranimation - Grundprinzip das eigentlich Modell wird als Skin (Haut) betrachtet unter der Haut befinden sich Bones (Knochen), die hierarchisch angeordnet sind und ein Skelett bilden (Knochen der Hände sind denen im Arm untergeordnet) eigentliche Animation besteht aus Key- Frames Bewegung eines Bones wird in Form einer Matrix beschrieben Berechnung für jeden Vertex, wie stark dieser vom Bone beeinflusst wird (Bone- Weight, Faktor liegt zwischen [0; 1], 1 = 100%) je näher ein Vertex an einem Bone liegt, desto stärker wird er von diesem beeinflusst um Rechenkapazitäten zu sparen, werden nur die Bones berechnet, die den Vertex am meisten beeinflussen und speichert deren Index mit

Charakteranimation - Transformation des Vertex: Jeder Vertex wird mit der Matrix des Bones transformiert, die ihn beeinflussen die Matrizen der Bones mit einem höheren Bone-Weight- Faktor haben einen stärkeren Einfluss auf den Vertex, daher wird jede Matrix mit dem Faktor multipliziert somit wird nur eine Transformation benötigt: die Summe der einzelnen Matrizen, multipliziert mit ihrem Faktor, ergibt eine Matrix, die alle in sich vereint

// Struktur für einen Vertex struct SVertex { tbVector3 vPosition; // Position tbVector3 vNormal; // Normalenvektor // Weitere Angaben... // In diesem Beispiel soll jeder Vertex von maximal vier Bones beeinflusst werden. // Wir speichern also vier Bone-Weights und die Indizes der vier Bones, auf die sie // sich beziehen. float afBoneWeight[4]; int aiBoneIndex[4]; }; // Funktion zum Transformieren eines Vertex zu einem bestimmten Zeitpunkt (Animation!) SVertex TransformVertex(const SVertex& Vertex, const float fTime) { tbMatrix amBoneMatrix[4]; // Die folgende Funktion soll die Matrix eines Bones zu einem gewissen Zeitpunkt in // der Animation liefern. Dabei müssen auch hierarchische Beziehungen im Skelett // beachtet werden. for(int i = 0; i < 4; i++) { // Fertige Matrix dieses Bones abfragen amBoneMatrix[i] = GetBoneMatrix(Vertex.aiBoneIndex[i], fTime); } // Nun haben wir die Matrizen der vier Bones, die den Vertex beeinflussen. // Jede Matrix wird mit dem dazugehörigen Bone-Weight-Faktor multipliziert. // Danach addieren wir alle Matrizen. tbMatrix mTranformation = amBoneMatrix[0] * Vertex.afBoneWeight[0] + amBoneMatrix[1] * Vertex.afBoneWeight[1] + amBoneMatrix[2] * Vertex.afBoneWeight[2] + amBoneMatrix[3] * Vertex.afBoneWeight[3]; // Vertex transformieren SVertex Result = Vertex; Result.vPosition = tbVector3TransformCoords(Vertex.vPosition, mTransformation); Result.vNormal = tbVector3TransformNormal(Vertex.vNormal, mTransformation); return Result; }

Charakteranimation - Skinning mit D3DX: Geometry-Blending Indexed Vertex Blending

PlugIns schreiben und laden

DLL-Dateien -> dynamische Bibliotheken Problem: Ein Programm, das durch PlugIns erweitert werden soll, weiß natürlich zur Kompilierzeit nichts von diesen PlugIns. Darum benötigen wir eine Methode, wie wir DLL-Dateien zur Laufzeit explizit laden können.

DLL-Dateien explizit laden // DLL-Datei von Direct3D 9 laden HMODULE hDLL = LoadLibrary("D3D9.dll"); if(!hDLL) { // Fehler! // Wahrscheinlich ist DirectX 9 nicht installiert... //... } //... // DLL-Datei wieder freigeben FreeLibrary(hDLL);

Adresse einer Funktion abfragen // DLL-Datei "WinMM.dll" laden HMODULE hDLL = LoadLibrary("WinMM.dll"); if(!hDLL) { // Fehler!... } // Die Funktion "sndPlaySoundA" aus der DLL-Datei laden BOOL (__stdcall* pFunc)(LPCSTR, UINT); pFunc = (BOOL (__stdcall*)(LPCSTR, UINT))(GetProcAddress(hDLL, "sndPlaySoundA")); if(!pFunc) { // Fehler!... } // Jetzt rufen wir die geladene Funktion auf. pFunc("C:\\Windows\\Media\\Ding.wav", SND_SYNC); // DLL-Datei wieder freigeben FreeLibrary(hDLL);

DLL-Dateien erzeugen // DLL-Hauptfunktion BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID pvReserved) { switch(dwReasonForCall) { case DLL_PROCESS_ATTACH: // Die DLL-Datei wird geladen und einem Prozess zugewiesen. break; case DLL_PROCESS_DETACH: // Die DLL-Datei wird entladen. break; } return TRUE; }

Funktionen und Klassen extern "C" { // Erste Version ohne Parameter __declspec(dllexport) void Test() { MessageBox(NULL, "Hallo! Ich bin Test ohne Parameter!", "Hallo", MB_OK); } // Zweite Version mit einem int-Parameter __declspec(dllexport) void Test(int i) { MessageBox(NULL, "Hallo! Ich bin aber auch Test, mit Parameter!", "Hallo", MB_OK); } }

Zugriff auf Variablen int g_iTest = ; extern "C" { // Funktion zum Liefern eines Zeigers auf die Variable g_iTest __declspec(dllexport) int* GetTest() { return &g_iTest; }

Kommunikation zwischen Anwendung und PlugIn Beim Start des Programms wird der PlugIns-Ordner durchsucht mit FindFirstFile() und FindNextFile() Jede DLL wird mit LoadLibrary() geladen HMODULE-Werte werden in einer globalen Tabelle gespeichert, sofern keine Fehler auftreten Jedes Plugin muss mehrere Funktionen mit festem Namen definieren: Init für die Initialisierung Exit für das Herunterfahren GetInfo, um Informationen wie Name, Autor und Version abzufragen Setup, um dem PlugIn wichtige Variablen des Programms mitzuteilen, wie zum Beispiel den Handle des Fensters und Zeiger auf wichtige Funktionen des Programms Wenn das PlugIn beispielsweise einen neuen Menüeintrag erzeugt hat, muss das Programm einen Klick darauf an das PlugIn weiterleiten. Am Ende werden alle DLLs entladen, nachdem Exit aufgerufen wurde.

Vielen Dank!