New Game project started

A few weeks ago, a friend and I started a game project. The working title is “The Lost Spells” – it is about a magician that did something really wrong and now he has to fight his way through monsters and zombies to reach a room containing the final spell that will send them all back where they came from.

If you like, you can follow us on Google+ – we post updates, news, concept art and more on a regular basis.

WebGL Demo of animated Character

I finally finished my WebGL demo to render an animated character. To create the JSON File, I changed my ParrotEngine Blender Export Script to output a JSON file instead of XML.

The demo was tested on Firefox 7 and 8, Opera 12 and Google Chrome 15 – each was running fine. Internet Explorer does not support WebGL – and probably never will, so you have to use another browser to see the demo…
Continue reading

Order of Matrix multipliation and its effect on transformations

One thing that I stuggle regularily with, is the order in which matrices should be multiplied to achieve a specific result. So I decided to get this clear for myself for good and all.

As you know, matrices (at least in our context of 3D graphics) represent transformations. Multiple transformation matrices can be combined using marix multiplication. But since this operation is not commutative, the order of the multiplication is important.

Since matrices represent transformations, they build new coordinate systems, too: These new systems are defined by axis vectors that have been transformed using the matrix. An example will clarify this fact:

In the examples used in this post, I will use a rotation matrix around 30 degrees, because \sin(30^\circ) = \frac{1}{2} and \cos(30^\circ) = \sqrt{\frac{3}{4}}, which is easy to write down and we still stay exact when calculating with it.

Part 1: A single transformation matrix

Given the origin system with the axis vectors \left(\begin{array}{c}1 \\ 0 \\ 0 \end{array}\right) and \left(\begin{array}{c}0 \\ 1 \\ 0 \end{array}\right), when we rotate these vectors around 30 degrees, we get the vectors \left(\begin{array}{c}\sqrt{\frac{3}{4}} \\ \frac{1}{2} \\ 0 \end{array}\right) and \left(\begin{array}{c}-\frac{1}{2} \\ \sqrt{\frac{3}{4}} \\ 0 \end{array}\right)
Continue reading

Main Character für die “Parrot Quest”

Der Hauptcharakter der Parrot Quest

Der Hauptcharakter der Parrot Quest

Das Spiel das ich als Demo für die ParrotEngine gerade erstelle benötigt natürlich einen Hauptdarsteller und wie der Name der Engine unschwer verrät wird es ein Papagei werden. Rechts seht ihr den aktuellen Stand des 3D Models. Ich erstelle alle Modelle in Blender. Der Papagei ist aktuell bereits gerigged und animiert.
Damit es voran geht, werde ich als erstes dieses Model verwenden um ein spielbares Level zu implementieren. Die Feinarbeiten kommen irgendwann später. Falls dies hier ein 3D-Artist liest und dieser fit in Blender ist, nehme ich auch gerne Hilfe an!

Die erste Testmap wird sehr simpel gestrickt sein. Auf dem Screenshot links sieht man den Weg der zurückgelegt werden muss. Links unten ist der Startpunkt (Player Spawn Point) und rechts der Bereich bei dessen Erreichen die Map als erfolgreich erledigt erkannt wird. Der Spieler wird diesen Bereich nicht verlassen können – auf diese Weise kann man sich später im Spiel nicht um Gegner und Hindernisse “herummogeln”. Geheimgänge, Abkürzungen und sonstige Geheimnisse müssen in einer Map gezielt eingebaut werden.

Screenshot des Mapeditors

Screenshot des Mapeditors

Um meine Engine nicht alleinig auf Jump’n Run Spiele auszurichten habe ich eine Zwischenschicht eingeführt: Das “JumpNRun Modul”. Dieses enthält neben dem auf diese Art Spiele spezialisierten Map-Editor auch weitere dafür benötigte Hilfsklassen. So bleibt die Engine zwar weniger “mächtig”, dafür aber allgemeingültig und kann später auch für eventuelle weitere Module verwendet werden. Ich denke da an soetwas wie ein “FirstPerson Modul” oder ein “Platform Modul”… doch eins nach dem anderen.

Resource Collections in der Parrotengine

Derzeit programmiere ich an einem Map-Editor. Dieser soll sowohl einfach zu bedienen, also auch vollständig bezüglich der Funktionalität sein. Dabei stellte sich mir das Problem wie ich sicherstellen kann, dass ein Spiel auf genau die gleichen Resourcen zugreifen kann wie der Editor: Schließlich werden die Elemente die im Editor in die Map platziert wurden auch vom Spiel benötigt wenn dieses die Map einladen und darstellen möchte.

Struktur der Resource Collections

Struktur der Resource Collections

Als Lösung für dieses Problem habe ich die Resource-Collections ins Leben gerufen. Es handelt sich hier um eine Datei im XML Format die eine Liste aller Resourcen enthält die ausgehend vom Ort der resource-collection.xml Datei erreichbar sind. Da die Engine bisher für alle Zugriffe auf Resourcen InputStreamSource-Objekte verwendet, nutzt das Konzept für die Collections diese natürlich ebenfalls. Das bedeutet, dass ein Programm, welches über irgendein InputStreamSource-Objekt an eine resource-collection.xml Datei kam, über genau das gleiche Objekt alle in der XML erwähnten Resource Objekte laden kann!

Die Engine selbst besitzt standardmäßig eine eigene ResourceCollection. Diese enthält neben dem Engine-Logo auch die Standard-Fonts, default-Texturen und Standard-Skyboxen. Damit Programme die die Engine nutzen den Satz an verfügbaren Resourcen ergänzen können gibt es das ResourceCollectionSet. Dieses enthält eine Liste von Resource-Collections.

Das ResourceCollectionSet kann jederzeit um weitere Resource-Collections ergänzt werden. Wird vom Spiel aus eine Resource angefordert, so geschieht das über die ReaderFacade:

 ReaderFacade facade = engine.getReaderFacade();
 MeshPrototype m = facade.readMeshPrototype("meshes/mesh1.xml");
 

Die Methodefacade.readMeshPrototype(…)ruft hier das ResourceCollectionSet auf und dieses sucht dann der Reihe nach in allen registrierten ResourceCollections nach “meshes/mesh1.xml”. Der erste Fundort wird dann genutzt um das Objekt zu laden.

Jede ResourceCollections kann dabei eine andere InputStreamSource besitzen: Netzwerk, ZIP-Archiv, lokales Fileystem, Klassenpfad,… alles ist hier erlaubt.

Um nun auf den eigentlichen Grund dafür zurückzukommen: Es genügt nun die Übergabe eines InputStreamSource Objekts sowie eine dafür gültige Pfadangabe zu einer resource-collection.xml um sicherzustellen, dass eine Menge von Resourcen genau definiert ist. Für die meisten Anwendungsfälle wird es wohl so sein, dass während der Entwicklungszeit das InputStreamSource Objekt eine Instanz vonDirectoryInputStreamSource ist, welches einfach auf ein Filesystem-Verzeichnis verweist. Später, in einem Release wird dies wohl eher ein Verweis auf ein ZIP oder JAR-Archiv sein.

Das ResourceCollectionSet-System ist derzeit nur im Subversion-Repository vorhanden. Es wird aber im nächsten Release der Engine enthalten sein zusammen mit Beispielprogrammen.