Project Portfolio Jaap van Muijden, oktober 2007
Voorwoord Met dit document tracht ik een idee te geven van de competenties die ik heb opgebouwd op het gebied van Game Design en Computer Graphics, en de projecten waarbij ik betrokken ben geweest. De meeste projecten zijn uit eigen initiatief gestart, en zijn alleen of met een klein team van twee personen uitgevoerd. De projecten zijn eigenlijk allemaal in mijn vrije tijd gemaakt, en de concrete ontwikkeltijden zijn daarom nogal moeilijk in te schatten. Helaas is veel van de broncode niet meer (direct) beschikbaar, maar uiteraard is het altijd mogelijk om dieper in te gaan op de gebruikte technieken, en -waar mogelijk- eventuele broncode in te zien. Bij veel van de projecten is een kleine demo beschikbaar onder het diskette icoon.
Persoonlijke gegevens Naam: Jaap van Muijden Geboortedatum: 20-09-1983 Adres: Zwaan 52 Postcode: 2381 KK Plaats: Zoeterwoude E-mail:
[email protected]
Project Portfolio
Jaap van Muijden
1
In het kort Over mijzelf Ik ben bezig met het creëren van spellen sinds ik voor het eerst achter een Commodore 64 kroop. Mijn eerste spellen waren vooral text(ascii)-based, waarna ik al snel de overstap maakte op de verschillende BASIC talen, waarin ik vooral grafische isometrische adventure games maakte. Eerst in QBasic, toen Visual Basic, totdat ik rond mijn zeventiende eindelijk in contact kwam met C; een verademing na jaren BASIC, en C++ is nog steeds veruit mijn favoriete taal. Na wat 2D-games (o.a. Space Melee en Mole Miners, zie verderop in dit document) begon ik met behulp van DirectX en OpenGL 3D games te ontwerpen, waar ik me nu nog steeds erg graag mee bezig houd. Hoewel ik voor mijn opleiding heb gekozen voor de grafische kant van game design, ben ik ook zeer geïnteresseerd in de andere aspecten zoals physics, AI en networking. Daarnaast ben ik ook bezig met GUI(design), heb ik als hobby (pixel)tekenen, en ben ik groot fan van de “2D Retro-look”. Ik speel zelf eigenlijk nagenoeg alle soorten (PC) games, en ik ben nu al een tijd nieuws-redacteur en reviewer voor FOK!games, één van de meest bezochte game-sites van Nederland. Ik richt me daar vooral op de technische aspecten, en ik ben bezig met het schrijven van een technische “How it works” artikel-reeks die daar binnenkort zal worden gepubliceerd. Tijdlijn 1999-2003 2002-2005 2005-2007 2006-heden
MBO opleiding CIT productontwikkeling te OGH Voorburg - Voltooid. Bachelor opleiding Elektrotechniek te TH Rijswijk - Voltooid. Bachelor Technische Informatica te TU Delft - Voltooid. Computer Science/Computer Graphics te TU Delft
2005-heden
Redacteur en game reviewer van FOK!games
Ervaringen C++ Win32 API TCP/IP C# OpenGL DirectX Compilers
4+ jaar, meerdere projecten (STL en andere bibliotheken) 3+ jaar mee gewerkt, vooral GDI, netwerk en GUI functionaliteit Meerdere applicaties, TCP en UDP via traditionele Winsock 2.0 en IOCP. Recent één project mee gewerkt, zie verderop in dit document Vaak vroeg in de ontwerpfase gebruikt, meestal in samenwerking met GLUT Versies 7,8 en 9, vooral Direct3D, shaders geschreven in HLSL en DX9. Meerdere simpele(!) compilers/evaluators ontworpen, waarvan één met OO ondersteuning.
Daarnaast heb ik tijdens mijn projecten en studies gewerkt met de volgende platforms en technieken: HLSL (PS en VS), C#, .net framework (XNA), Rigid Body Physics, Skeletal Animation, Speech Recognition, Managed DirectX, Direct Draw, STL, Berkley Sockets. Visual Studio, GCC en DevC++.
Theoretische achtergrond Theoretische en praktische ervaring met vectoren en matrices (2,3 en 4D), en bekend met de verschillende transformatie(matrice)s in de Polygon Pipeline. Ook vertrouwd met wiskundige technieken als diagonalistatie, digitale filters, signaaltransformaties, aliasing en sampling. Brede achtergrond op het wiskundige vlak, inclusief differentiaalvergelijkingen en complexe getallen. Verder bekend met schaduw-technieken zoals Shadow Volumes en Shadow Mapping en de standaard technieken en effecten zoals Bump Mapping (Normal Mapping), HDR, Bloom, Tone mapping en Cartoon Shading. Ook bekend met netwerkstructuren als Winsock, de TCP/IP stack en IOCP (Overlapped Transfers in Windows)
Project Portfolio
Jaap van Muijden
2
Mole Miners
Het slagveld. Vier mijnwerkers strijden om de poen
Om in Le Shoppe wapens te kunnen kopen...
Mijn laatste 2D-project voordat ik overstapte op 3D. Mole Miners is een remake van de klassieker Mine Bombers. In dit spel moet de speler de strijd aangaan met maximaal drie andere mijnwerkers om zo veel mogelijk schatten op te graven. Met de opgegraven rijkdommen kunnen de spelers explosieven en ander wapentuig kopen om het graven te versnellen, en om de tegenstanders dwars te zitten. (meestal komt het vooral neer op het laatste). Het origineel was geschreven voor MS-DOS door de Finse ontwikkelaar Skitso Productions. Mijn remake maakt gebruik van DirectDraw 7. Ik heb geprobeerd om de oude look&feel van het DOS-tijdperk te handhaven. Naast deels opgefriste graphics MoleMiners nieuwe wapens, met verbeterde algoritmes.
Technische details Het spel heeft dertien wapens, welke allemaal eenvoudig als aparte modules aan de broncode konden worden toegevoegd door middel van abstractie en Generic Programming. Het spel maakt gebruik van een ingebouwde kaartgenerator voor de levels en een zelf ontworpen algoritme om het real-time verspreiden van gas en vloeistof realistisch te laten verlopen. Zo kan de speler gassen en vloeistoffen loslaten die zich realistisch door de tunnels zullen verspreiden. Project Portfolio
Jaap van Muijden
...wordt het veld wordt zo snel mogelijk geroofd van al zijn schatten.
3
Het project is uiteindelijk stopgezet omdat ik er een betere grafische back-end bij wilde maken, aangezien het spel op de oudere systemen wat stroef begon te lopen als er te veel bewegende objecten op het scherm stonden, ondanks de verscheidene optimalisaties die ik had toegepast. De gebruikte DirectDraw-implementatie is achteraf gezien nogal simpel, en crasht zodra de device context is verloren (bijvoorbeeld door alt-tab). Desondanks haalde ik redelijk goede prestaties met deze oplossing. De assets worden via een GDI-stub ingeladen in een DIB, waarna deze wordt gekopieerd naar een DirectX RGB surface. Ik maakt in dit project gebruik van Color-Keying om transparantie te creëren. Hoewel ik het origineel vooral grafisch wilde benaderen, zijn alle gebruikte afbeeldingen van de grond af opgebouwd en ontworpen door mijzelf. ...om elkaar daarna te lijf te gaan met explosieven en ander wapentuig.
Hieronder een korte samenvatting van de meest interessante wapens, overgenomen uit de readme: Barrel
Doesn't explode by itself, but creates a very deadly rolling flame. Can wipe out cave structures when walled in and detonated remotely. Does what a mine does, invisible, except for a blip now and then. Doesn't explode by itself, creates random effects of various bombs in the area. Big BOOM Dynamite with remote detonator. Shoots extremely strong bursts to the sides that cut through everything. Explosive gas that spreads through the tunnels. Can be used to direct gas and rolling flames into your enemies cave system. Roll this around to make a handy fuse. Creates an expanding foam that hardens explodes when exposed to air. Best weapon ever. Cement that creates the same effect, without the exploding.
Mine Crate Nuke Remote1 SpikeBomb2 Gas Wall Powder Keg Bag1 Bag2
Mole Miners Datum Rond 2002-2003 Status Beta (afgebroken) Downloads Back-end Win98-Vista, DirectX 7
Project Portfolio
Technieken Bibliotheken
DirectDraw7, DirectInput, Win32 GDI, C++ DirectX 7 API
Ontwikkelplatform
Visual C++
Jaap van Muijden
4
Etherial
De speler is hier te zien met een aantal Scripted Actors.
Etherial was één van mijn 3D projecten in DirectX 8. Ik werkte samen met een tweede ontwikkelaar Roel Reijerse waarmee ik hierna nog veel andere projecten ben gestart. We creëerden een simpele fixed-pipeline 3D engine met ondersteuning voor materials, textures en simpele color-ops. Het spel zou een soort 3D adventure moeten worden. Het ondersteunde simpele culling en space partitioning voor de omgevingen, die automatisch gegenereerd werden. De meest interessante feature van dit project was het Dynamic Obj Library Linker (DOLL) systeem. Dit bestond uit een dynamische linker die gecompileerde .obj files in run-time kon linken aan ons scriptsysteem. Zo konden we scripts draaien die waren geschreven in C of assembler, en gecompileerd met Borland C++. We hadden een paar boerderijdieren gescript die achter de hoofdpersoon aanliepen. Helaas is het project wegens tijdgebrek gestopt. De modellen waren gemaakt in de low-poly modelleer-software Milkshape, De “bad guy” en met een coverteerprogramma omgezet naar ons interne formaat. Het spel ondersteunde skeletal animation en een “click-'n-play” systeem waardoor modellen gemakkelijk op elkaar konden worden geplakt om wapens, kleding en andere gescripte objecten te combineren.
Etherial Datum Rond 2002 Status Alpha (afgebroken) Downloads
Project Portfolio
Technieken Bibliotheken
DirectX 8, Win32. Linking, Skeletal Animation DirectX 8 API
Ontwikkelplatform
Visual C++
Jaap van Muijden
5
Toolkits & Frameworks Naast deze games heb ik een aantal toolkits geschreven die vooral heb ingezet om het ontwikkeltraject van enkele games te versnellen. Deze heb ik uiteindelijk weinig gebruikt, maar gaven me inzicht in de verschillende OS systemen en hebben me vooral geholpen met het schrijven van netwerkcode en met het snel ontwikkelen van een GUI onder windows.
The GDI toolbox Deze toolbox bevat een verzameling C++ wrappers die gebruikt kunnen worden om snel dialoogvensters te creëren (hetzij via de resouce section, hetzij direct), en bevatte functies om afbeeldingen in te laden en te manipuleren in DIBs.
Stutter Stutter is een simpele bibliotheek die de gebruiker in staat stelt om direct op het GDI framework van Windows grafische operaties te verrichten. Zo ondersteunt het Alpha-Blending, Color Keying en rotaties van afbeeldingen. Het had bibliotheken om TGA files met transparantie in te laden en bevat simpele Anti-Aliasing logica voor tekst en lijnen. Het wordt vooral gebruikt voor het opzetten van een lichte grafische interface. Het maakte op zijn beurt weer gebruik van The GDI toolbox
JNetwerk Een tweetal C++ wrappers om de standaard Winsock-en Berkley Sockets interfaces, met ondersteuning voor IOCP, wat ik in de tweede versie heb laten vallen om het geheel zo licht en portable mogelijk te houden. Het wordt op dit moment gebruikt in mijn IFCON project, en wordt steeds uitgebreid. Het bestaat uit een aparte interface definitie, en een Winsock2.0 implementatie, zodat het snel en gemakkelijk kan worden omgezet naar traditionele Berkley Sockets voor bijvoorbeeld Linux applicaties. Ik heb het o.a. voor een (grafische) debug-console over TCP en een UDP/TCP-repeater om netwerk lag te genereren.
Toolkits & Frameworks Datum 2002-2007 Status Work In Progress Downloads
Project Portfolio
Technieken Bibliotheken
Winsock, IOCP, Berkley Sockets, GDI+,DirectX 7 Winsock 2.0, Win32 API
Ontwikkelplatform
Visual C++
Jaap van Muijden
6
Easter Egg Een top-down flyer die was bedoeld als een Easter-Egg in een plugin voor een intern elektronisch simulatiepakket van de TH Rijswijk. Uiteindelijk is project nooit geïntegreerd omdat de plugin eigenlijk sneller klaar was dan de Easter-Egg. In deze game was ik vooral bezig met de modellen en textures. De levels waren gegenereerd aan de hand van afbeeldingen die als hoogtekaart werden gebruikt. Het modelleren is wederom gedaan in Milkshape, met een eigen omzetter naar een handelbaar formaat. Het is ontworpen in Borland C++ Builder, aangezien we daarin ook de plugin zelf geschreven hadden. Het spel ondersteunde verschillende waves van vijanden en wapens
Easter Egg Datum Rond 2004 Status Afgebroken Downloads
Technieken
DirectX 8,
Bibliotheken
DirectX 8 API
Ontwikkelplatform
Borland C++
Space Melee Space Melee was een Cave Shooter met multiplayer ondersteuning en de mogelijkheid tot User Created Content. Er is helaas weinig meer van terug te vinden. De engine was redelijk uitgebreid, en laadde het level in drie delen in. Het eerste gedeelte was een bitmap met collision informatie, de tweede was een x-bits afbeelding die het level moest grafisch moest voorstellen, waarbij elke kleur naar een bepaalde texture werd omgezet. Zo kon een speler met een simpel tekenprogramma zoals MSPaint zijn eigen levels creëren. Een derde bestand beschreef de interactieve objecten in een simpele scripttaal. Het spel had pixel-per-pixel collision detection (met early rejection algoritmes) waarbij de speler met zijn voertuig niet alleen kon schieten, maar er ook voor kon kiezen om met zijn voertuig stukken uit de omgeving te rammen door er tegenaan te vliegen. Elke speler had een royale hoeveelheid wapens waarvan de werking simpel was aan te passen of uit te breiden. Helaas zijn er geen screenshots van bewaard gebleven.
Space Melee Datum Rond 2001-2002 Status Beta (afgebroken) Downloads
Project Portfolio
Technieken Bibliotheken
DirectDraw7, DirectInput, C++ DirectX 7 API
Ontwikkelplatform
Visual C++
Jaap van Muijden
7
Procedural Tree Generation
Split-view van één van de gegenereerde landschappen
Het doel van dit project was het genereren van een landschap. Aangezien een kaal landschap niet erg uitdagend was, werd er besloten om het landschap op te vullen met bebossing. De opdracht voor dit project kwam van de TU Delft, en aangezien ze daar vooral met OpenGL werken, is er besloten om deze opdracht in OpenGL te implementeren. Er werd daarbij gebruik gemaakt van de GLUT bibliotheek voor initialisatie van de OpenGL omgeving.
Zonsondergang
Het algoritme dat is gebruikt is door mijzelf ontwikkeld en geïmplementeerd. Het is een recursief algoritme dat over elke tak wordt toegepast. De skybox is gegenereerd met 3rd party software , het algoritme voor terreingeneratie is geschreven door mijn teamgenoot. Een demonstratieprogramma van het algoritme is beschikbaar. Resultaten van het algoritme
Project Portfolio
Jaap van Muijden
8
En nog ééntje als afsluiter
Procedural Tree Generation Datum Rond 2006 Status Afgesloten Downloads Demo WinXP-Vista,OpenGL,GLUT
Project Portfolio
Technieken Bibliotheken
OpenGL, procedural generation, L-systems OpenGL, GLUT
Ontwikkelplatform
DevC++,Visual c++
Jaap van Muijden
9
Raytracer met Photonmapper
Caustics, refraction en global illumination
De bekende Ring-Scene
Als vervolg op het vorige project is er een Raytracer ontwikkeld, met de mogelijkheid om Photon maps te genereren en te renderen. Deze Photon mapping techniek zorgt ervoor dat er met weinig rekenkracht een grote sprong kan worden gemaakt in realisme, mits de scene zelf voldoet aan bepaalde eisen. Er zijn meerdere builds gemaakt, waarvan ééntje gebruik maken van instructieset-specifieke optimalisaties. Sommige demo executables draaien daarom alleen op Pentium 4 of nieuwer. Ikzelf was vooral betrokken bij het opzetten van het ontwerp en de implementatie van de wiskundige vergelijkingen en intersectie algoritmes. Later in het ontwerpproces is de implementatie grotendeels overgenomen door mijn teamgenoot. SDL is gebruikt voor het weergeven van de resultaten
Raytracer Datum 2006-2007 Status Afgesloten Downloads Demo app & .avi WinXP-Vista, SDL
Project Portfolio
Technieken Bibliotheken
o.a. Raytracing en Photonmapping. SDL
Ontwikkelplatform
Visual C++
Jaap van Muijden
10
PlanetView
Het uitklapproces vastgelegd
PlanetView is een simpele applicatie die de aardbol laat zien met daarop verschillende datasets. Er zijn een aantal nieuwe technieken gebruikt. Het was mijn eerste project dat gebruik maakt van .net en C#. Verder draait nagenoeg het gehele programma op de GPU, en maakt het gebruik van het DirectX/XNA framework. De Vertex shader bestaat uit een aangepaste tween-actie (gehackte radial-lerp) die de Vertices roteert en “uitklapt” van een bol naar een vlak. De Pixel shader is verantwoordelijk voor het mixen en belichten van de sets. Er worden meerdere datasets gebruikt, sommige laten het effect van de jaargetijden zien op de poolkappen, anderen laten het verschil tussen dag en nacht zien, of beide.
Het uiteindelijke resultaat
PlanetView Datum 2006-2007 Status Afgesloten Downloads Demo
WinXP-Vista, XNA & .net 2.0 benodigd
Project Portfolio
Technieken Bibliotheken
HLSL, .net, C#, XNA, managed DirectX XNA, .net framework
Ontwikkelplatform
Visual C# Express
Jaap van Muijden
11
IFCON
Test applicatie waar Actors worden toegevoegd, verwjiderd en gemanipuleerd. Blauw is bewegend, Lichtblauw is vastgeklemd, rood is stabiel evenwicht door zwaartekracht
Integration-Free Collision Over Networks. Een project waar ik sinds kort mee bezig ben. Het is een zelf ontworpen collision/physics framework in C++ dat een integratie-loze timestepping techniek gebruikt. Alle verplaatsing-trajecten worden intern algebraïsch geregistreerd als (oplossingen van) simpele differentiaalvergelijkingen die voor elke willekeurige tijd kunnen worden opgelost. Elke interactie (botsing) met de omgeving zorgt er voor dat deze vergelijkingen opnieuw worden opgesteld. De tijd tot de volgende interactie kan deterministisch worden vastgesteld door een kwadratische vergelijking op te lossen, hoewel dat op dit moment nog met lineaire benadering wordt gedaan in verband met het gebruikte BSP systeem. Dit event-based systeem heeft meerdere voordelen: het synchroniseren van de actors over verschillende omgevingen over een netwerk heeft De actors zijn convexe gebieden van willekeurige grootte relatief weinig bandbreedte nodig met een relatief en omschrijving, de vaste omgeving een serie polygonen. hoge naukeurigheid. De algoritmes zijn dusdanig opgesteld dat ze nagenoeg onafhankelijk zijn floating-point fouten, en bevatten geen epsilon waarden of andere offsets die beschermen tegen nauwkeurigheidsfouten; het geheel draait op dit moment op float precisie. Verder kan er tegen met een minimum aan geheugengebruik en ontwikkeltijd een geschiedenis worden bijgehouden van de trajecten, en kan de tijd zonder problemen achteruit worden teruggespeeld. Het nadeel is dat rotatie van bounding-hulls (bijv. voertuigen) niet (gemakkelijk) te implementeren is zonder gebruikte maken van discrete integratie of recursieve benadering, iets waar ik met dit systeem juist vanaf wil, verder heeft dit systeem (nog) geen fysieke interactie tussen dynamische objecten, hoewel de botsingen tussen twee convex hulls wel mbv sweeping worden gedetecteerd.
Project Portfolio
Jaap van Muijden
12
Het wiskundige framework is op dit moment in 2D, vanwege de complexiteit en de mankracht tot mijn beschikking. Mijn doel is om er een snelle online 2D shooter mee te maken. Het systeem ondersteund op dit moment nog geen 2D-CSG (geomod), maar de algoritmes zijn al ontworpen en getest in een apart project. Hiermee wordt het mogelijk om de omgevingen real-time aan te passen, denk aan het bouwen van bruggen en muren, en het opblazen en aanpassen van het speelveld. Waarschijnlijk zal ik in de toekomst overstappen op quadtrees in plaats van een BSP-tree om de culling precies te houden wanneer ik overstap van lineaire benadering op een volledig algebraïsche oplossing. (Iets wat overigens bijna geen extra CPU kracht vraagt.) Ik ben op dit moment met een uitgebreide test applicatie het framework aan het testen, en de eerste tests beloven een erg precieze, en relatief “lag”-ongevoelige spel-ervaring.
IFCON Datum 2007 Status Work in progress Downloads Demo applicatie WinXP-Vista, GLUT
Project Portfolio
Technieken
Zie omschrijving
Bibliotheken
GLUT, Win32, Winsock2.0, JNetworks Visual C++
Ontwikkelplatform
Jaap van Muijden
13