1 Spelimplementatie met PHANToM Auteur Domien Nowicki Promotor Chris Raymaekers Co-promotor Karin Coninx Begeleiders Lode Vanacken Joan De Boeck Acade...
Samenvatting Videogames tegenwoordig maken enkel gebruik van visuele en auditieve feedback, en een combinatie van toetsenbord, muis of joystick voor spel besturing. Met de komst van haptic interfaces die force feedback en spelbesturing in 3 of 6 vrijheidsgraden toelaten, is het mogelijk om een meer immersieve benadering te brengen voor videogames. Dit eindwerk is een spelimplementatie die tracht zo een meerwaarde te bieden aan een zelfgemaakt videogame. Het zeker mogelijk dat in de toekomst haptics een belangrijke rol gaat spelen bij videogames.
Hoofdstuk 1
Inleiding Videogames maken tegenwoordig vooral gebruik van de traditionele input devices zoals muis, toetsenbord, en joystick. Verder wordt er vooral gebruik gemaakt van enkel visuele en auditieve feedback. Recent werd hier verandering in gebracht door de Nintendo Wii [27] (zie figuur 1.1 (a)), een spelcomputer met groot succes. Dit is grotendeels te danken aan de Wii Remote, een innovatie in spelbesturing. De Wii Remote is een input device, wat lijkt op een afstandsbediening, en laat videogames de beweging van de speler volgen in 6 vrijheidsgraden (X, Y, Z, en rotatie in 3 assen). De Wii Remote maakt ook gebruik van een sensorbar, wat toelaat voor meer precisie bij het richten op het TV scherm. Ook de Nintendo DS [28] (zie figuur 1.1 (b)), een draagbare spelcomputer, was een groot succes. Deze maakte het mogelijk om videogames te besturen door een combinatie van een touchscreen en een traditioneel gamepad. Andere vormen van input, zoals de P5 Glove [29] (zie figuur 1.1 (c)), die al bestonden voor de Wii, waren minder succesvol. De P5 Glove is een input device voor de PC in de vorm van een handschoen, dat de individuele buiging van elke vinger en ook de beweging van de hand volgt in 6 vrijheidsgraden, net zoals de Wii Remote. De weinige spellen die ondersteuning boden voor dit apparaat, en andere kleine problemen zorgden ervoor dat dit niet een groot succes werd [30]. Met de komst van haptic interfaces die force feedback en spelbesturing in 3 of 6 vrijheidsgraden toelaten, is het mogelijk om een meer immersieve benadering te brengen voor videogames.
1.1
Wat is haptics
Het woord “haptic” komt van het Griekse haptesthai, wat voelen of contact betekent. Tegenwoordig bestaan er haptic interfaces die toelaten om een gebruiker virtuele objecten te voelen, om er mee te interageren via een computer. Het werd aangetoond dat het voelen van virtuele objecten de gebruiker meer bewust maakt van de virtuele omgeving [1, 2]. Een haptic interface is een fysisch apparaat dat het mogelijk maakt om een gebruiker de vorm, zachtheid, en textuur van een virtueel object te voelen. Het maakt het ook mogelijk
1
(a) Nintendo Wii
(b) Nintendo DS
(c) P5 Glove
Figuur 1.1: Enkele spelcomputers en input devices. om bijvoorbeeld objecten virtueel te verplaatsen, te manipuleren en nog veel meer. Het kan ook gebruikt worden als entertainment, zoals bijvoorbeeld bij videogames. De bedoeling van dit eindwerk is een spel implementatie te maken dat gebruik maakt van een haptic interface om zo een meerwaarde te bieden. Er wordt geprobeerd om op deze manier de besturing van het spel realistischer te maken, om de speler de acties die gebeuren in het spel te laten voelen, en om de speler onder te dompelen in de spel wereld. Kortom, zodat de speler een heel nieuwe sensatie voelt.
1.2
Toepassingen van haptics
Toepassingen van haptics vonden eerst en vooral plaats bij flight simulators en bediening van robotica op afstand [2]. Flight simulators hebben meestal een zo realistisch mogelijk nagemaakte cockpit, met een beeldprojectie. Bij een simulatie beweegt de cockpit net zoals in het echt. Piloten in training kunnen hun vliegkunst verbeteren door met een flight simulator te oefenen. Er zijn ook toepassingen in geneeskunde [11], zoals oa. chirurgische training simulaties en chirurgische ingrepen op afstand. Zo kunnen chirurgen in opleiding trainen, en moeten chirurgen niet altijd op dezelfde plaats zijn als de pati¨ent voor een ingreep (bijvoorbeeld een chirurg uit China die opereert op een pati¨ent in Belgi¨e). Verder zijn er ook toepassingen in onderwijs en de industrie, zoals bestuderen van complexe data sets, CAD systemen en virtueel beeldhouwen.
1.3
Enkele haptic interfaces
Er bestaan verschillende haptic interfaces die force feedback ondersteunen, en dit in verschillende vrijheidsgraden. Haptic interfaces van minder dan 3 DOF (degrees of freedom, of vrijheidsgraden) zijn minder geschikt om een gebruiker een object te laten voelen in een virtuele 3D omgeving. Haptic interfaces van 3 of 6 DOF hebben meestal een aangrijpingspunt (ook wel haptic interface point, of HIP genoemd) zoals een stylus of knobbel. De gebruiker neemt dit vast en kan dit vrij bewegen in een bepaalde ruimte. De haptic workspace is de ruimte waarin het aangrijpingspunt vrij kan bewegen, en is meestal in de vorm van een
2
virtuele kubus. De Rumble Pak van Nintendo [22] (zie figuur 1.2 (a)) is een haptic interface van 1 DOF en laat toe om trillingen weer te geven aan de gebruiker. De Impulse Stick van Immersion [25] (zie figuur 1.2 (b)) is een voorbeeld van een haptic interface van 2 DOF, omdat deze in 2 richtingen kracht kan uitoefenen. De Phantom serie van Sensable [23] (zie figuur 1.3) biedt haptic interfaces aan met verschillende specificaties. Zo is er de Phantom Premium 1.0, 1.5, 3.0, Phantom Premium 1.5/6DOF, 3.0/6DOF, Phantom Desktop en Phantom Omni. Sommige zijn in staat tot 6 DOF force feedback en 6 DOF positionele waarneming (zoals de Premium 1.5/6DOF of 3.0/6DOF), andere enkel tot 3 DOF force feedback en 3 DOF positionele waarneming. De Falcon van Novint [26] (zie figuur 1.2 (c)) is in staat tot 3 DOF force feedback, en 3 DOF positionele waarneming. De prijs van de Phantom is nogal gepeperd, omdat deze uit nauwkeurige instrumenten bestaat. Deze wordt meestal voor bedrijven of academische doeleinden gebruikt. De Falcon echter bestaat uit minder nauwkeurige, goedkopere onderdelen en brengt zo de prijs dichter voor de gewone consument. Dit maakt het interessant voor videogames.
(a) Rumble Pak van Nintendo(b) Impulse Stick van Immersion (c) Falcon van Novint
Figuur 1.2: Haptic interfaces van 1, 2 en 3 DOF.
(a) Premium 1.5
(b) Premium 1.5/6DOF
(c) Desktop
Figuur 1.3: Enkele Phantom devices van Sensable.
3
(d) Omni
Hoofdstuk 2
Het spel Vooraleer het idee achter de eigen spel implementatie besproken wordt, wordt er eerst gekeken naar reeds bestaande spellen die gebruik maken van tenminste 3 DOF force feedback, en bestaande spellen waarbij haptics nadien werden toegevoegd.
2.1 2.1.1
Bestaande spellen met 3 DOF en 6 DOF haptics Haptic Battle Pong
Haptic Battle Pong [12, 4] (zie figuur 2.1 (a)) is een van de eerste spellen die gebruik maakt van 3DOF force feedback en 6DOF positionele waarneming. Het spel is voor 2 spelers en elke persoon zit achter een Phantom haptic interface. De 2 spelers worden verbonden door middel van een TCP verbinding. De speler controleert de paddle met de Phantom en het toetsenbord wordt gebruikt om de speler te laten rondwandelen in de pong arena. Wanneer de bal de racket raakt wordt er force feedback gegenereerd, zodat de speler de inslag kan voelen. De speler verliest een leven wanneer de bal in zijn kamp valt. De speler kan de bal terugslaan in “paddle mode”, en in “gun mode” kan hij raketten afschieten naar de tegenstander.
2.1.2
HaptiCast
HaptiCast [13, 5] (zie figuur 2.1 (b)) is een multiplayer spel dat de speler in een first-person shooter death match omgeving plaatst. Bij HaptiCast neemt de speler de rol aan van een tovenaar en beschikt over een reeks toverstafjes met speciale haptische eigenschappen: • Lift-and-swing toverstaf: Met deze toverstaf kan de speler objecten opnemen en vrij bewegen in de omgeving via haptics. Het object wordt als het ware een haptic probe waarmee de omgeving afgetast kan worden, of waarmee de ander speler verpletterd kan worden. De speler voelt de gewicht, impuls en contact krachten dat het object ondergaat. • Bolt en Blast toverstaf: Hiermee kan de speler projectielen afvuren, en wordt er een terugslag gevoeld. De Blast toverstaf zorgt voor een grote knal kracht, en de Bolt toverstaf vuurt snel kleine energie stoten af.
4
(a) Haptic Battle Pong
(b) HaptiCast
Figuur 2.1: Enkele screenshots van spellen met tenminste 3 DOF force feedback.
(a) Lift-and-swing
(b) Blast
(c) Bolt
(d) Lob
Figuur 2.2: HaptiCast toverstafjes. • Lob toverstaf: Deze toverstaf lijkt op een Y-vormige katapult. De speler moet aan de katapult trekken en dan loslaten om granaten af te schieten. De ontwikkelaars van HaptiCast willen aantonen dat het gebruik van haptics bij de toverstafjes een significante bijdrage brengt bij de immersie en entertainment waarde van het spel.
2.1.3
Novint spellen
Novint (de maker van de Falcon) brengt zelf ook heel wat nieuwe spellen op de markt die 3 DOF input en force feedback ge¨ıntegreerd hebben, met uiteraard ondersteuning voor de Falcon. Novint heeft momenteel een zestigtal spellen gepland, waarvan de helft al uitgebracht is. Om de speler een voorsmaakje te geven van deze spellen werden een aantal demos van deze spellen gebundeld in het spel “Newton’s Monkey Business”. Dit spel wordt gratis geleverd bij de aankoop van een Falcon. Bovendien, Novint brengt ook modificaties (“mods”) uit voor bestaande spellen, zoals oa. Half Life 2, Quake 4, Portal, Team Fortress 2 en Counter Strike, zodat deze ook gebruik maken van haptics. Al deze spellen maken uniek gebruik van haptics om de gameplay te verbeteren. Volgens IGN [31] zijn de Falcon en first person shooters een goede combinatie voor echte gamers, en
5
(a) Airhockey
(b) Cave Brain
(c) Chomper
(d) Duck Launch
(e) Force Fighter
(f) Roly Poly Rollin’
(g) Snowbear
(h) Table Tennis
(i) Teardown
Figuur 2.3: Enkele Novint spellen. de Half Life 2 mod is hier een voorbeeld van. De wapens bieden hier een unieke terugslag, van een harde knal van het pistool tot de snelle stoten van het machine geweer. Met de Gravity Gun kunnen objecten opgenomen worden en kan het gewicht van het object gevoeld worden. Bij explosies worden er trillingen in alle richtingen gevoeld. Kortom, de uitbreiding van een bestaand spel met haptics kan ook een geweldig succes zijn.
2.2
Eigen spelimplementatie
In deze sectie wordt de eigen spelimplementatie kort besproken.
2.2.1
Type
De eigen spelimplementatie noemt “Ballaptics” en is een soort van balspel. Het werd vooral ge¨ınspireerd door spellen zoals Roly Poly Rollin’, Neverball, en Ballance (zie figuur 2.4). De
6
speler neemt controle over de bal, en moet zien de zwaartekracht te overwinnen door de bal in balans te houden en niet te laten vallen.
2.2.2
Doel
Het doel van het spel is alle munten proberen op te rapen, en zo tot de uitgang geraken. De uitgang wordt enkel actief indien alle munten verzameld zijn. Indien de bal van het platform afvalt, verliest de speler een leven. Als alle 3 levens verloren zijn, is het spel verloren.
2.2.3
Besturing
De bal kan in 4 richtingen bewegen (zie figuur 2.4 (c)): links, rechts, vooruit of achteruit, en de besturing van de bal gebeurt met een haptic interface. Deze bewegingen zijn relatief ten opzichte van de huidige camera, die de bal constant volgt vanaf een korte afstand. De camera kan optioneel bewogen worden door gebruik te maken van de muis.
2.2.4
Force feedback
De speler zal tijdens het spel force feedback voelen door interacties van de bal met de omgeving. Zo zal de speler voelen wanneer de bal botst met de grond, voelen hoe dat de bal beweegt, en voelen hoe er meer kracht moet uitgeoefend worden afhankelijk van het profiel van de ondergrond.
2.3
Conclusie
Oorspronkelijk waren er niet veel spellen die gebruik maakten van haptics. Met de komst van de Novint Falcon, dat de focus legt op haptics en gaming en dit ook effectief aan de man brengt, wordt hier verandering in gebracht. Nieuwe spellen en bestaande spellen die uitgebreid worden met haptics brengen een heel nieuwe sensatie naar de gebruiker, waarbij vele positieve reacties zijn.
7
(a) Ballance
(b) Neverball
(c) Eigen spel
Figuur 2.4: Enkele screenshots van bal spellen.
8
Hoofdstuk 3
Game Engine In dit hoofdstuk wordt de game engine besproken die gebouwd werd voor de eigen spelimplementatie. De game engine is een verzamelnaam voor de verschillende systemen die actief zijn tijdens de uitvoering van het spel. Voor de game engine werden er 217 klasses geschreven, wat een totaal is van ongeveer 18000 lijnen code. Een korte lijst van de systemen die ge¨ıntegreerd zijn: • Graphics door de OGRE3D library [15] • Audio door de OpenAL library [16] • Physics door de Newton Game Dynamics library [17] • Low-level haptic device ondersteuning door de CHAI3D library [18] • Scripting door de Squirrel library [19] • Threads door de ZThreads library [20] • Signal en slot systeem door de sigc++ library [21] • Eigen object management met component structuur • Eigen simpele GUI library • Eigen haptic manager voor het high-level beheren van de haptic interface
3.1
Gebruikte libraries
In deze sectie worden de gebruikte libraries in het kort besproken.
9
3.1.1
OGRE3D
OGRE3D (Object-Oriented Graphics Rendering Engine) is een cross-platform, open source, snelle, flexibele, scenegraph 3D engine geschreven in C++. Deze library maakt het makkelijker en meer intuitief om applicaties te ontwikkelen die gebruik maken van hardware versnelde 3D graphics. Het abstraheert al de details van de onderliggende render systemen, zoals OpenGL en DirectX, en komt met vele features. In tegenstelling met andere rendering engines maakt OGRE3D veel gebruik van design patronen, wat het enorm krachtig maakt. Deze library komt met veel documentatie, vele voorbeelden, en een hulpzaam forum voor ontwikkelaars. Vele open source games maken gebruik van deze library, en er zijn ook enkele commerci¨le games die gebruik maken van OGRE3D, zoals Ankh en Pacific Storm.
3.1.2
OpenAL
OpenAL is een cross-platform, open source, audio library, dat effici¨ent overweg kan met 3D positionele audio. De syntax van deze library lijkt op OpenGL en is makkelijk te gebruiken. Deze library komt met een duidelijke handleiding en enkele voorbeelden. OpenAL werd gebruikt in games zoals oa. Doom 3, Quake 4, Unreal Tournament 3 en Prey.
3.1.3
Newton Game Dynamics
Newton Game Dynamics is een cross-platform, closed source, kleine, snelle, stabiele, realistische physics engine die speciaal voor games gemaakt is. Deze library komt met een korte handleiding, vele voorbeelden, en een hulpzaam forum voor ontwikkelaars. Deze library werd bijvoorbeeld gebruikt in HaptiCast, en het bekende game Penumbra.
3.1.4
Sigc++
Sigc++ is een cross-platform, open source, flexibele, snelle, typesafe callback library voor C++. Het implementeert het signals en slots concept [33] zonder enige compiler extensies of metacompiler. Met deze methode kunnen objecten acties uitvoeren op bepaalde gebeurtenissen van andere objecten, en dit op een onafhankelijke manier. Objecten kunnen signalen uitsturen die informatie over het event bevatten, wat dan ontvangen wordt bij de slot van een ander object. De auteur had al enige ervaring met deze library en daarom werd deze gekozen.
3.1.5
Squirrel
Squirrel is een cross-platform, open source, imperatieve en object geori¨enteerde scripting taal, dat ge¨ınspireerd werd door talen zoals Python, Javascript en Lua. Deze library gebruikt weinig geheugen en past in de real-time benodigdheden van games. De syntax van Squirrel lijkt veel op die van C, maar maakt wel gebruikt van dynamische types.
10
Squirrel maakt het mogelijk om high-level objecten te besturen vanuit scripts, zonder dat het spel gehercompileerd moet worden. De auteur had ook al enige ervaring met deze library en daarom werd deze gekozen.
3.1.6
ZThreads
ZThreads is een cross-platform, open source, geavanceerde, high-level object geori¨enteerde threads library. Deze library abstraheert de onderliggende POSIX pthread of Windows threads API, en volgt een Java-stijl thread design. In het spel is er 1 hoofd thread dat de physics, graphics, en audio aandrijft. Voor de haptics was er een aparte thread nodig.
3.1.7
CHAI3D en haptic manager
Deze libraries zorgen voor de haptic rendering in het spel. Deze libraries worden meer gedetailleerd besproken in hoofdstuk 4.
3.2
Object management en compositie
Het hart van de hele game engine is eigenlijk het gameobject systeem dat beheerd wordt door de object manager. Het idee is dat heel de virtuele spel wereld uit gameobjects bestaat. Dit idee is vooral ge¨ınspireerd door een artikel over gameobject compositie uit de Game Programming Gems series [6]. Deze gameobjects op zich, zijn opgebouwd uit aparte componenten die elk een specifieke taak vervullen. In de traditionele manier wordt er een Object basis klasse gedefinieerd en wordt deze voor elk gametype (bijvoorbeeld Player, GnomeEnemy, HealthItem, AmmoItem) uitgebreid met specifieke functionaliteit, wat aanleiding geeft tot een grote afleidingsboom met veel verschillende klasses met vaak overeenstemmende programmacode (zie figuur 3.1). Soms is het onduidelijk van welk object moet afgeleid worden, omdat een gametype mogelijk in verschillende categorie¨en tegelijk behoord. Dit is in tegenstelling tot object compositie, waardat enkel de verschillende componenten, waaruit een gametype bestaat, gedefinieerd moeten worden. De verschillende gametypes worden dan opgebouwd uit de componenten. Deze componenten zijn modulair gebouwd, zodat ze zo veel mogelijk herbruikt kunnen worden. Nog een voordeel van object compositie is dat het extern inladen van gameobjects makkelijker maakt, zoals oa. door XML of door scripting. Allerlei soorten van componenten kunnen gecombineerd worden om een nieuw gameobject te cre¨eeren, zonder dat deze moeten afgeleid worden van een bestaand type zoals in de traditionele afleidingsboom.
3.3
Componenten
In deze sectie wordt er geprobeerd te schetsen uit wat voor soort componenten gameobjects bestaan. Om een concreet voorbeeld te geven, de bal die te zien is in de spel wereld, bestaat uit 4 basis componenten (zie ook figuur 3.2):
11
Object
Entity
...
Drawable
Item
Human
GnomeEnemy
Player
...
Script
HealthItem
...
AmmoItem
...
Figuur 3.1: Tradionele gameobject afleidingsboom. • Een MeshGraphic component die de ronde bal grafisch voorstelt. • Een SceneNode component die de MeshGraphic koppelt aan een ruimte in de grafische wereld. • Een Body component die een bol voorstelt in de fysieke wereld. • En een PhysicsSynchronizer component die zorgt dat de SceneNode positie en ori¨entatie gesynchroniseerd wordt met de Body. Deze bal heeft oa. nog andere componenten zoals een script component, een camera component, een body controller component, en componenten die de kracht effecten voor de haptics controleren. Een volledige lijst van ge¨ımplementeerde componenten is te vinden in de appendix. Componenten zoals een MeshGraphic, SceneNode en Body komen vaak voor bij verschillende gametypes. Deze componenten telkens manueel aan een gameobject toekennen vanuit C++ code is een sequentie die bijna altijd hetzelfde is. Om deze taak te verlichten kunnen componenten extern ingeladen worden, waardoor de game engine ook meer data driven wordt.
3.4
Data driven
Componenten kunnen extern ingeladen worden via een XML data bestand, dat specificeert welke componenten een gameobject nodig heeft, en met welke parameters. Een voordeel van deze data driven manier is dat de engine niet opnieuw gecompileerd moet worden als er wat kleine parameters moeten veranderen. In listing 3.1 is er voorbeeld XML code te zien, dat de body component definieert van de bal in de spel wereld. Gelijkaardige XML constructies bestaan er voor de andere componenten.
12
(a) MeshGraphic
(b) Body
(c) SceneNode
(d) PhysicsSynchronizer
Figuur 3.2: Basis componenten van de bal. Listing 3.1: Bal Body voorbeeld XML. <properties> <e l l i p s o i d > <position x=”0” y=”62” z=”2”/> <mass v a l u e =”10”/> <material name=” b a l l ”/> <events s c r i p t =”m y s c r i p t”>
In principe wordt hier gewoon een ellipso¨ıde vorm gedefinieerd voor de bal, met een begin positie, kracht en massa. Er wordt ook een script gekoppeld met het “on-exit” event van deze body. Wanneer de bal uit de fysieke wereld vliegt, wordt de functie “OnExit” op geroepen bij het script. In sectie 3.6 wordt dit meer besproken. Overigens wordt er een “ball” materiaal gekoppeld aan deze body. Bij het opstarten van het spel wordt er gezocht naar een XML data bestand dat al de beschikbare materialen definieert voor de physics engine. Voor 2 verschillende materialen kunnen dan interactie parameters gedefinieerd worden, zoals statische en dynamische frictie, elasticiteit en zachtheid, die dan bij de physics simulatie zullen gebruikt worden. Deze physics materialen zijn niet verbonden met haptics materialen.
13
Dit “ball” materiaal is nodig zodat het bal gameobject later een signaal kan krijgen wanneer er collisies zijn met dit materiaal. De componenten van een gameobject telkens apart specificeren in XML kan soms nog altijd wat werk zijn. Zeker als het gaat om een reeks van gameobjects dat dezelfde componenten bevat, maar alleen een paar kleine eigenschappen zijn anders. Dit is het geval voor de munt gameobjects die voorkomen in het spel. Deze munt gameobjects verschillen enkel van positie, de rest van de componenten zijn onveranderd. De oplossing hiervoor is gebruik maken van templates, zoals gametypes.
3.5
Gametypes en scenes
Gametypes (zie figuur 3.3) bevatten component templates, die weten hoe ze een component moeten aanmaken met de juiste parameters voor een gameobject. Een gametype wordt ook ingeladen vanuit XML, en kan dan verschillende gameobjects instanti¨eren met exact dezelfde componenten. Instantiatie
Object
Type
Component
ComponentTemplate
Component
ComponentTemplate
Component
ComponentTemplate
Figuur 3.3: Gametype dat een gameobject instantieert. Gametypes worden in combinatie met gamescenes gebruikt. Een gamescene definieert een groep van gameobjects, door voor elk gameobject te verwijzen naar het gametype dat ge¨ınstantieerd moet worden. Elke verwijzing kan bijkomstige informatie bevatten, zoals oa. posities die anders zijn. Verder is het ook mogelijk om een gamescene in ´e´en keer in te laden, en dit wordt bijvoorbeeld gebruikt om een level volledig in of uit te laden. In listing 3.2 is er voorbeeld XML code te zien van een gamescene die een ground, exit, ball en coin type instantieert. De gameobject instantie van het coin type brengt een verandering aan ´e´en van de bestaande componenten, nl. de positie van de body wordt veranderd. Dit voorbeeld geeft precies aan hoe dat een level gamescene eruit ziet. De exit, coin en ball types werken samen door signalen te versturen naar elkaar via scripting, en zo ontstaat er een spel.
3.6
Scripting
De bespreking van gameobjects is tot nu toe enkel over statische eigenschappen geweest. Voor de dynamische interacties wordt er gebruik gemaakt van scripting. In het algemeen doen de
14
Listing 3.2: Gamescene voorbeeld XML.
componenten het “harde” werk, de scripts dienen enkel als een soort van dirigent die alles controleert en in gang zet. De scripts zijn volledig event gebaseerd en hier komt de kracht van signals en slots tot uiting [33]. Een component kan signalen uitsturen, zodat een andere component op dit event kan reageren. Een body component stuurt bijvoorbeeld signalen (begin, contact process, end) wanneer hij in contact komt met een andere body, of wanneer hij uit de wereld vliegt. Zo kan een munt bijvoorbeeld te weten komen als hij werd opgeraapt. Door na te gaan als het materiaal waarmee de munt in contact kwam van het type “ball” is, weet hij dat de bal de munt heeft opgeraapt. Maar dit kan nog uitgebreid worden: De signalen kunnen verbonden worden met een script dat uitgevoerd moet worden. Zo heeft het bal type een script component dat reageert op verscheidene signalen. Indien bijvoorbeeld de bal uit de wereld vliegt (een body exit signaal), zal de bal een leven verliezen. Elk script component heeft zijn eigen scope. Dit wilt zeggen dat alles wat een script doet of aanmaakt eigen is aan de instantie van de script component. Zoals eerder aangehaald wordt er gebruik gemaakt van Squirrel voor scripting. Squirrel op zich heeft enkel basis functionaliteit om met strings en getallen te werken. Om Squirrel te integreren met het component systeem, worden de component klasses manueel gebonden met Squirrel. Zo is het mogelijk dat de componenten vanuit Squirrel scripts bestuurd kunnen worden. In listing 3.3 is een fragment van een Squirrel script te zien, dat uitgevoerd wordt wanneer de body van een munt in contact komt met de bal. Dit script verwijdert de body van de munt (zodat deze niet meer opgeraapt kan worden), zet een particle effect in actie, maakt de grafische munt mesh onzichtbaar, speelt een geluidseffect af, en stuurt een munt pickup signaal. Dit munt pickup signaal wordt gehoord door het exit type, en deze telt af totdat alle munten opgeraapt zijn. Als dat zo is wordt de uitgang actief en kan de bal naar de uitgang
15
gaan. Listing 3.3: Squirrel script voorbeeld. f u n c t i o n OnContactBegin ( c o n t a c t ) { body . s e t N u l l S h a p e ( ) ; particlesystem . unfreeze ( ) ; meshgraphic . s e t V i s i b l e ( f a l s e ) ; audiosource . playResource (” coinpickup ” ) ; coinpickupsignal . signal ( ) ; }
3.7
Conclusie
Een eigen spel schrijven is heel wat werk. Bij de game engine zijn er heel wat systemen die actief zijn. Het gebruik van de component structuur en scripting maakt dat deze engine heel data driven en flexibel is. De essentie van het bal spel zit in feite in de XML bestanden en scripts, en het zou volledig mogelijk zijn om een heel ander spel te maken met ongeveer dezelfde game engine.
16
Hoofdstuk 4
Haptic rendering In dit hoofdstuk wordt er besproken hoe krachten gegenereerd worden voor force feedback, en welke toolkits hiervoor ter beschikking zijn. Verder wordt ook besproken welke krachten er gebruikt zijn in de spelimplementatie. Haptic rendering wordt gedefinieerd als het proces van het berekenen en genereren van krachten in respons tot gebruiker interacties met virtuele objecten [3, 2]. In figuur 4.1 is dit proces grafisch voorgesteld. De positie en ori¨entatie van de haptic interface point wordt telkens na een bepaalde periode gemeten, en vervolgens wordt er een nieuwe respons kracht berekend, die dan ingesteld wordt bij de haptic interface als feedback. Voor 6 DOF force feedback wordt er ook een torque (of moment) gegenereerd. Position Orientation
Calculate force
Force Torque
Collision Detection
Figuur 4.1: Veralgemeende haptic loop.
4.1
Uitdagingen
Onderzoek heeft aangetoond dat hoge update rates van 500Hz tot 1kHz nodig zijn voor een stabiele weergave van haptic rendering [2]. Anders kunnen er mogelijk oscillaties optreden en voelt het niet zo natuurlijk aan voor de gebruiker. Er is dus een limiet in rekentijd beschikbaar
17
voor haptic rendering, en dit kan een probleem vormen voor algoritmes die een lange tijd nodig hebben om een respons kracht te berekenen. Dit is zeker waar voor videogames, die zo dicht mogelijk bij de limiet proberen te geraken om het onderste uit de kan te halen voor de beschikbare hardware. Videogames moeten mooie graphics beelden genereren, muziek tijdig afspelen, artifici¨ele intelligentie simuleren, en dit allemaal vele keren per seconde. Een haptic rendering loop die vooral veel keer meer dan grafisch per seconde moet geupdate worden, kan de performantie mogelijk aantasten.
4.2
Proxy rendering, surface rendering, en kracht effecten
In deze sectie wordt besproken welke typische algoritmen gebruikt worden bij haptic rendering en hoe dit effect heeft op de eigen spelimplementatie. Een veel gebruikt algoritme is proxy rendering [2] (zie figuur 4.2). Bij proxy rendering is er een punt (de proxy, of god object genoemd) dat de haptic interface point volgt, maar deze is gelimiteerd om niet doorheen de geometrie van de virtuele omgeving te gaan. Indien de haptic interface point er toch doorheen gaat, wordt er force feedback gegenereerd in de vorm van een veerkracht. Er kan ook gebruik gemaakt worden van surface rendering, om materiaal eigenschappen te simuleren die bij dit contact punt horen, zoals bijvoorbeeld statische en dynamische frictie, of zachtheid. Er zijn een aantal collision detection algoritmen beschikbaar voor haptics die dit contact punt kunnen berekenen, maar dit gaat niet zonder enige kost. Verder bestaat er ook de mogelijkheid om kracht effecten te genereren bij de haptic rendering. Deze gebruiken meestal geen geometrie van de virtuele omgeving om een kracht te genereren, maar enkel de huidige positie van de haptic interface point. Er bestaan vele mogelijke kracht effecten, zoals oa.: • Veerkracht effect: Deze genereert een kracht die probeert de haptic interface point naar een neutraal punt in de haptic workspace te trekken. • Vibratie effecten: Hierbij worden trillingen gegenereert. • Frictie effecten: Deze kunnen de vrije beweging van de haptic interface point vertragen. Bij de implementatie van het spel werd geen gebruik gemaakt van proxy rendering, alleen maar van kracht effecten. Het gebruik van proxy rendering zou erop wijzen dat er een ´e´en op ´e´en mapping bestaat tussen de haptic workspace en de virtuele omgeving. De positie van de haptic interface point zou direct gekoppeld zijn met die van de bal. Dit heeft enkele problemen [9]. De haptic workspace is fysisch klein, en de virtuele omgeving groot. Een kleine beweging van de haptic interface point zou overeenkomen met een grote beweging in de virtuele omgeving, wat de bal moeilijk te besturen maakt. Verder, de gebruiker zou de hand redelijk stabiel moeten houden zodat er geen ongewillige bewegingen zijn van de bal. En ook, de bal kan in principe niet vrij bewegen. De haptic interface be¨ınvloed meer indirect de beweging van de bal, omdat uiteindelijk de physics engine de bal realistisch laat bewegen.
18
Proxy
Figuur 4.2: Proxy rendering.
4.3
Toolkits
Voor haptic rendering bestaan er heel wat toolkits. In Extending an Haptic API van Pascal Porta [7] worden een reeks van toolkits in het algemeen besproken en kritisch ge¨evalueerd. In deze sectie worden enkele populaire haptic toolkits besproken met het oog op gebruik bij een videogame.
4.3.1
OpenHaptics
• Ontwikkelaar: SensAble Technologies, Inc. • Documentatie: Veel en duidelijk, vele voorbeelden. • Openheid broncode: Closed source. • Licensie: Commercieel of academisch. • Ondersteunde platformen: Microsoft Windows (XP, 2000), Linux, Mac OS X. • Ondersteunde apparaten: Alle SensAble Phantom apparaten. OpenHaptics [23] is beschikbaar in 2 vormen: de commerci¨ele versie en de academische versie. De academische versie is gratis beschikbaar voor academische instituties. Qua functionaliteit is er geen verschil tussen beide (hoewel dit niet kan beloofd worden in de toekomst), alleen krijgt de ontwikkelaar geen ondersteuning bij de academische versie. OpenHaptics bestaat in principe uit 3 grote lagen boven elkaar (zie ook figuur 4.3): • HLAPI: Een high level laag die instaat voor surface rendering en proxy rendering. • HDAPI: Een uniforme device onafhankelijk laag om eender welk Phantom apparaat te besturen. • PDD: Een low-level laag die zorgt voor de device drivers voor elk Phantom apparaat apart.
19
Hoewel HLAPI zelf geen graphics rendering doet, is het wel bedoelt om gebruikt te worden naast OpenGL applicaties. De syntax hiervan is dan ook zeer gelijkend op die van OpenGL. Bovendien steunt HLAPI op eigenschappen en buffers die OpenGL beschikbaar stelt, zoals oa. de depthbuffer of feedback buffer. • Minpunten – Indien HLAPI gebruikt wordt, wordt de ontwikkelaar verplicht om OpenGL te gebruiken voor graphics. Mogelijk veel werk om deze toolkit te integeren met een bestaande OpenGL graphics library. – Enkel ondersteuning voor SensAble apparaten, Falcon wordt niet ondersteund. • Pluspunten – Vele opties voor surface en proxy rendering, en kracht effecten. – Makkelijk en snel te gebruiken dankzij OpenGL-achtige syntax. – Veel en duidelijke documentatie, veel voorbeelden.
Figuur 4.3: Lagen van OpenHaptics.
4.3.2
CHAI3D
• Ontwikkelaar: Francois Conti, Federico Barbagli, Dan Morris, Chris Sewell, en CHAI3D contributors. • Documentatie: Doxygen API referentie, vele voorbeelden. • Openheid broncode: Open source. • Licensie: GNU GPL v2 of “Professional Edition License”. • Ondersteunde platformen: Microsoft Windows, Linux, Mac OS X. • Ondersteunde apparaten: Alle SensAble Phantom apparaten, Novint Falcon, alle apparaten van Force Dimension, MPB Freedom 6.
20
CHAI3D [18, 10] is ´e´en van de weinig volledige open source haptic toolkits. Het is volledig gratis en ontwikkeld door voornamelijk academici voor gebruik bij onderzoek. CHAI staat voor “Computer Haptics & Active Interfaces”. Net zoals HDAPI van OpenHaptics biedt CHAI3D een uniforme laag aan om device onafhankelijk een haptic device te besturen. Verder biedt CHAI3D ook de mogelijkheid voor surface rendering, proxy rendering, en kracht effecten. Ook valt op te merken dat CHAI3D het grafische gedeelte voor zich neemt door OpenGL te gebruiken. Deze toolkit gebruikt namelijk ´e´en enkele scenegraph voor zowel de graphics als haptic rendering. Verder biedt het ook een manier om snel haptic scenes te cre¨eeren door XML bestanden in te laden. CHAI3D biedt ook een virtueel haptic interface aan (zie figuur 4.4). Deze dient als een oplossing voor diegene die niet altijd een haptic apparaat ter beschikking heeft, en om krachten te visualiseren. De muis wordt gebruikt om de virtuele haptic interface te besturen. • Minpunten – Moeilijk te integreren bij een bestaande applicatie. – Sterke koppeling met eigen OpenGL renderer. Het is mogelijk om de graphics rendering kant van de scenegraph te negeren, dit is wat HAPI van de H3DAPI doet. – Minder documentatie in vergelijking met OpenHaptics. Voorbeeld code dient als beginnende documentatie. • Pluspunten – Surface en proxy rendering, en kracht effecten. – Ondersteuning voor vele haptic interfaces. – Open source. – Eenvoudig opgebouwd, niet te grote code base, makkelijk te begrijpen code en design. – Virtueel haptic interface om te testen indien geen hardware momenteel beschikbaar is.
4.3.3
H3DAPI
• Ontwikkelaar: SenseGraphics AB. • Documentatie: Korte handleiding, Doxygen API referentie, vele voorbeelden. • Openheid broncode: Open source. • Licensie: GNU GPL v2 of commercieel. • Ondersteunde platformen: Microsoft Windows, Linux, Mac OS X.
21
Figuur 4.4: Virtueel haptic device van CHAI3D. • Ondersteunde apparaten: Alle SensAble Phantom apparaten, Novint Falcon, alle apparaten van Force Dimension en HapticMaster van Moog FCS Robotics. H3DAPI [14, 24] is een scenegraph API en gebruikt OpenGL voor graphics rendering en hun eigen HAPI voor haptic rendering. Het gebruikt net zoals CHAI3D ´e´en enkele scenegraph voor zowel de graphics rendering als haptic rendering1 . Verder promoot H3DAPI het gebruik van X3D voor snelle prototyping van een virtuele 3D wereld. X3D is een XML bestandsformaat dat ge¨evolueerd is van VRML om 3D sc`enes en objecten voor te stellen. Voor meer geavanceerde animaties en interacties kan er gebruik gemaakt worden van Python scripting. Het is ook mogelijk om met traditionele C++ code in H3DAPI te werken. HAPI biedt een uniforme toegang tot verscheidene haptic devices net zoals CHAI3D. Hiervoor zijn wel de gepaste driver libraries nodig voor de devices die ondersteund worden. Voor de haptic rendering (om krachten te genereren op basis van de gegeven geometrie) kan HAPI gebruik maken van CHAI3D, OpenHaptics, of eigen renderer zoals bijvoorbeeld de god object renderer of de Ruspini renderer. Indien gebruik gemaakt wordt van de OpenHaptics renderer, is het enkel mogelijk de Phantom devices te besturen. Maar, de andere haptic renderers kunnen nog steeds de Phantom apparaten gebruiken. HAPI zelf maakt geen gebruik van enige graphics rendering2 . Dit maakt het mogelijk om HAPI apart te gebruiken zonder H3DAPI, voor enkel de haptic rendering. Er is zelfs een voorbeeld beschikbaar dat aantoont dat DirectX gebruikt kan worden in combinatie met HAPI. Hier is ook een voorbeeld genaamd SpaceTennis beschikbaar, dat aantoont hoe een spel gemaakt wordt met behulp van H3DAPI voor haptics. Dit spel werd in enkele lijnen Python script ge¨ımplementeerd. • Minpunten – H3DAPI komt complex over, mede dankzij het “fields” en “routes” design. Het heeft een grote code base en de code is niet direct makkelijk te begrijpen. 1
Met uitzondering van de CHAI3D haptic renderer, want deze renderer houdt een aparte scenegraph bij voor haptic rendering. 2 Met uitzondering van de OpenHaptics haptic renderer, omdat de OpenHaptics HLAPI, op informatie van OpenGL steunt, zoals de depthbuffer of feedback buffer, voor de haptic rendering.
22
– Te sterke focus op X3D en Python. – Moeilijk te integreren bij een bestaande applicatie. – De ontwikkelaar is verplicht de eigen OpenGL renderer te gebruiken, tenzij enkel gebruik gemaakt wordt van HAPI. – Meer documentatie dan CHAI3D maar minder in vergelijking met OpenHaptics. Voorbeeld code dient als beginnende documentatie. • Pluspunten – Surface en proxy rendering, en kracht effecten. – Ondersteuning voor vele haptic interfaces. – Open source. – Keuze tussen haptic renderers. – HAPI apart te gebruiken zonder H3DAPI.
4.3.4
Keuze toolkit voor eigen spel
Het is moeilijk een keuze te maken tussen deze toolkits voor gebruik bij de eigen spelimplementatie. Verder moet de keuze voldoen aan volgende bijkomende restricties: 1. Er moet ondersteuning zijn voor de Novint Falcon. 2. Het moet mogelijk zijn om de graphics library OGRE3D te gebruiken. Deze eerste restrictie is omdat de auteur van dit eindwerk graag wou ontwikkelen met een nieuw device dat populair is voor games. Verder werd de graphics library OGRE3D succesvol gebruikt bij vele verscheidene games. Deze is makkelijk te gebruiken, en heeft de mogelijkheid om schitterende graphics te leveren. De featurelist van OGRE3D kan niet worden ge¨evenaard bij de toolkits die ook graphics aanbieden zoals CHAI3D of H3DAPI. De toolkits worden nu afzonderlijk besproken als mogelijke keuze: • OpenHaptics: De eerste restrictie sluit het gebruik van OpenHaptics uit omdat deze niet het gebruik toelaat van andere apparaten behalve die van SensAble. Ook de sterke koppeling met OpenGL is niet erg aantrekkelijk. • H3DAPI: Deze toolkit gebruikt een eigen scenegraph voor de graphics rendering, wat de combinatie met OGRE3D moeilijk maakt. Verder gebruikt H3DAPI een complex design van fields en routes, en ligt er een sterke nadruk op het gebruik van X3D en Python. Het zou beter zijn om enkel de haptics library te beschouwen van H3DAPI, namelijk HAPI. • HAPI: Deze library is een goede kandidaat die in combinatie met OGRE3D gebruikt zou kunnen worden3 voor surface en proxy rendering, en kracht effecten. En het biedt 3
Zolang niet de OpenHaptics haptic renderer gebruikt wordt.
23
ondersteuning voor zowel de Falcon als Phantom apparaten. Maar, uiteindelijk werd er niet gekozen voor deze toolkit. Dit was een persoonlijke keuze, en ook omwille van het feit dat HAPI veel van de onderliggende systeem code abstraheert, terwijl het gewenst was om meer controle te hebben over de haptic rendering. Verder bestaat HAPI uit veel “glue code” om met de verschillende haptic renderers te werken, wat de code niet zo eenvoudig maakt. Om deze rede is het ook moeilijk om de bestaande code te veranderen of uit te breiden. • CHAI3D: Uiteindelijk werd er voor deze toolkit gekozen omwille van de eenvoudigheid ervan. CHAI3D ondersteunt ook zowel de Falcon als Phantom apparaten. De code en design ervan is makkelijk te begrijpen en de code base is niet te groot. Hoewel CHAI3D ook een eigen scenegraph gebruikt voor graphics, werd dit probleem opgelost.
4.3.5
Integratie CHAI3D
Omdat het spel enkel gebruik maakt van kracht effecten, zou het voldoende zijn om een scenegraph aan te maken in CHAI3D en enkel deze aan te vullen met de gewenste kracht effecten, of cGenericPotentialField in CHAI3D nomenclatuur. Een goed voorbeeld van deze methode is te vinden in de “implicit functions” demo. Maar, er zit een probleem in deze methode voor gebruik bij een spel. Bij de initializatie van de applicatie start CHAI3D een precisie timer voor de haptics, en deze roept een callback op die effectief de haptic rendering uitvoert. Maar bij CHAI3D wordt er nergens gebruik gemaakt van een mutex lock of ander thread synchronizatie primitieve. Dit heeft als gevolg dat er ofwel geen verandering mag gebeuren aan de scenegraph, of alle veranderingen moeten gebeuren vanuit de haptic loop. Bij een spel is er dikwijls een game thread apart van de haptic thread die mogelijk de kracht effecten wil veranderen, en dit zou een probleem vormen omdat hier geen synchronizatie voor bestaat. In plaats van diep in de CHAI3D code te duiken en overal er voor te zorgen dat de synchronizatie vlot verloopt werd er voor een andere oplossing geopteerd. Er werd voor het spel een eigen high-level haptic manager gecre¨eerd die zelf de kracht effecten beheerd en de synchronizatie ervan. Dit is makkelijker dan de eerst genoemde oplossing en geeft meer controle over de haptic rendering. De high-level manager gebruikt de uniforme laag die CHAI3D biedt om een haptic interface te besturen. De code voor de scenegraph, proxy rendering, collisie detectie en OpenGL graphics rendering werden verwijderd, omdat deze toch niet gebruikt werden.
4.4
High-level haptic manager
De haptic manager is een high-level manager die berekent welke kracht er bij de haptic interface ingesteld moet worden, en geeft ook toegang aan het spel om de huidige positie van de haptic interface point te weten te komen. De haptic manager heeft een lijst van kracht effecten (ook wel force affector genoemd), en vraagt telkens aan deze om een nieuwe kracht te berekenen op basis van de nieuwe positie. Een force affector kan bijvoorbeeld een veerkracht,
24
een vibratie kracht of eender welk haptic effect zijn. De haptic manager berekent dan de vector som van deze krachten, en stelt het in bij de haptic interface. Een 1kHz haptic thread wordt aangemaakt door de haptic manager als initi¨ele stap. Om de thread te laten slapen om de 1 milliseconde wordt er gebruik gemaakt van een precisietimer4 . Het spel zelf verloopt ook via een thread, en om communicatie tussen deze twee threads te synchronizeren werd er een systeem bedacht. Het is belangrijk om op te merken dat de game thread op ongeveer 60Hz loopt, wat een groot verschil is met de update rate van de haptic thread. Updates van het spel naar de force affector nemen dus plaats op een trager ritme. Daarom dat de force affectors onafhankelijk van de game thread werken, zodat dit op het ritme van de haptic thread kan. De physics engine stelt het spel op de hoogte van verschillende gebeurtenissen, zodat de force affectors deze veranderingen kunnen verwerken. Om de force affectors te besturen, zoals bijvoorbeeld verander veerconstante, of verander vibratie sterkte, wordt er gebruik gemaakt van force affector commando’s. De game thread maakt deze commando’s aan, en de haptic thread consumeert deze aan het begin van zijn iteratie (zie figuur 4.5). Zowel de game thread als de haptic thread gebruiken een mutex lock voor de synchronizatie voor het produceren en consumeren van commando’s, maar geen van beide threads zullen ooit moeten wachten. De haptic thread is de hoogste prioriteit thread, en kijkt altijd eerst indien de mutex lock al bezet is. Als dat zo is, zal hij proberen de volgende iteratie de commando’s te consumeren. Indien de haptic thread de mutex lock inneemt, zal hij die aan het einde van zijn iteratie ook terug vrijgeven. Met andere woorden, de mutex lock is altijd vrij ten opzichte van de game thread, en dus moet deze ook nooit wachten. Als het spel de haptic interface point positie wilt weten wordt dezelfde mutex lock gebruikt. Haptic Thread
Game Thread 1. Lock
2. Unlock
Commando
1. Lock?
Commando 2. Unlock Commando
Figuur 4.5: Threads en force affector commando’s.
4.5
Belang van de camera
Het is belangrijk om op te merken dat de camera een belangrijke rol speelt bij de haptic rendering van dit spel. De krachten die gegenereerd worden als interactie van de bal met de omgeving moeten relatief zijn tot de camera. Hiermee wordt bedoeld dat wanneer de bal bijvoorbeeld links tegen een muur botst, de natuurlijke respons zou dan zijn dat er een tegenkracht naar rechts gevoeld wordt. Rechts is echter relatief tot de camera zoals de 4
Deze timer haalt effectief 1 milliseconde resolutie. Onder Windows maakt deze gebruik van de multimedia timers met een kernel event object.
25
gebruiker de virtuele omgeving ziet, en kan strikt gesproken in de 3D ruimte in eender welke richting zijn afhankelijk van de camera. Deze virtuele omgeving is een 3D vectorruimte, en kan opgespannen worden door verschillende basissen. Belangrijke bassisen in dit geval zijn de standaardbasis, en de basis die overeen komt met de camera5 . Er wordt vanuit gegaan dat er een kracht reeds berekend werd die ten opzichte van de standaardbasis is uitgedrukt. Om de equivalente kracht te berekenen die relatief is tot de camera, moet er een verandering van basis plaatsvinden. Dit is een welbekend probleem in de vector calculus. Er wordt eerst een matrix berekend die de verandering van basis transformatie uitdrukt. Dan, om een vector van de ene basis naar de andere basis te transformeren, wordt deze vector vermenigvuldigd met de transformatie matrix. We noemen Tsc de matrix voor de transformatie van standaardbasis naar camera basis, en Tcs voor camera basis naar standaardbasis. De camera basis kan uitgedrukt worden in 3 eenheidsvectoren die orthogonaal zijn, zoals een vector naar rechts (Cr), een vector naar boven (Cu) en een vector die voorwaarts wijst (Cf). We krijgen dan: Crx Cux Cfx (4.1) T cs = Cry Cuy Cfy Crz Cuz Cfz
en
T sc = T cs−1
−1
Crx Cux Cfx = Cry Cuy Cfy Crz Cuz Cfz
(4.2)
Gegeven een vector v, uitgedrukt als v~s = (vsx , vsy , vsz ) ten opzichte van de standaardbasis, en als v~c = (vcx , vcy , vcz ) ten opzichte van de camera basis, dan geldt:
(4.3)
(4.4)
vsx T sc · v~s = T sc · vsy = v~c vsz
en
vcx T cs · v~c = T cs · vcy = v~s vcz
Deze laatste vergelijking kan ook gebruikt worden om een uitwijking van de haptic interface point (die eigenlijk ten opzichte van de camera basis is) om te zetten naar een uitwijking ten opzichte van de standaardbasis. Dit wordt bijvoorbeeld gebruikt om te weten in welke richting de bal moet bewegen indien de haptic interface point beweegt.
4.6
Kracht effecten in het spel
In deze sectie wordt besproken welke kracht effecten er gebruikt werden in het spel. 5
Deze camera basis is in OGRE3D makkelijk verkrijgen.
26
4.6.1
Basis beweging
De bal in het spel wordt gezien vanuit het standpunt van een 3de persoonscamera, en deze camera volgt de bal de hele tijd vanaf een korte afstand. Om de bal te besturen werd er gekozen voor een methode die lijkt op de “virtuele doos” metafoor [8], met een veerkracht, net zoals besproken in het doctoraatsproefschift van Pieter Jorissen over Dynamic Interactions for Networked Virtual Environments [9]. Bij deze methode wordt er gebruik gemaakt van een veerkacht om de haptic interface point in een neutraal punt in de haptic workspace te houden. Dit gebeurt door een kracht uit te oefenen naar het neutraal punt toe die sterker wordt naarmate de haptic interface point meer uitwijkt van dit neutraal punt. Een uitwijking van dit neutraal punt, veroorzaakt door de gebruiker, wordt gebruikt om de bal te bewegen door een kracht aan te leggen bij de bal die overeenkomt met deze uitwijking. Zo is het mogelijk om de bal te laten rollen in een richting met een snelheid die overeenkomt met de grootte van de uitwijking. Naarmate de gebruiker de bal sneller wilt laten rollen, zal er een sterkere kracht uitgeoefend moeten worden, want de tegenkracht gegenereerd door de veerkracht wordt ook groter. De virtuele omgeving wordt gezien vanuit een camera, en deze uitwijking is uitgedrukt ten opzichte van de camera basis. Deze moet uitgedrukt worden ten opzichte van de standaardbasis (zie sectie 4.5), zodat het duidelijk is in welke richting de gebruiker wilt dat de bal beweegt. In het spel is er een constante globale zwaartekracht, die ervoor zorgt dat de bal naar de grond getrokken wordt. Om die rede is het niet mogelijk om de bal vrij te bewegen in de Y richting, en dus wordt deze richting genegeerd. Het is dus enkel mogelijk om de bal te besturen in de X en Z richting. De veerkracht wordt berekend volgens de wet van Hooke met demping: F~ = −k · d~ − c · ~vhaptic
(4.5)
Waarbij: • F~ : De uiteindelijke veerkracht die gebruikt wordt bij de force feedback. • k: De veerconstante. • c: De dempingsconstante van de veer. • ~vhaptic : De snelheid van de haptic interface point. ~ De uitwijkingsvector van de haptic interface point (~ • d: phaptic ) ten opzichte van het neutraal punt in de haptic workspace (~ porigin ). Deze uitwijkingsvector wordt als volgt berekend: d~ = p~haptic − p~origin
(4.6)
De veerconstante bepaalt hoe sterk de trekkracht is van de veer. Een grote veerconstante voelt stijf aan, terwijl een kleine veerconstante losser aanvoelt. De demping zorgt voor een vertraging op de beweegbaarheid van de haptic interface point. Het gebruik van de demping
27
zorgt ervoor dat de haptic device niet begint heen en weer te oscilleren. De dempingsconstante en veerconstante zijn empirisch bepaald, zodat het goed aanvoelt bij het spel. In het spel zijn er ook zandgebieden, dat de veerconstante en dempingsconstante aanpassen, zodat het moeilijker wordt om doorheen zo een gebied te bewegen. De snelheid van de haptic interface point wordt berekend door bij elke iteratie van de haptic loop het verschil met de vorige haptic interface point positie te nemen. Dit levert een snelheid op over een periode van ongeveer 1 milliseconde (voor een 1kHz haptic loop). Het is ook mogelijk om de gemiddelde snelheid te berekenen over N iteraties, waarbij telkens de oudste gemeten positie vervangen wordt met de nieuwe positie. Dit werd getest maar er werd niet veel verschil gevoeld voor kleine waarden van N . Voor grote waarden van N werd de demping zelfs ongedaan gemaakt en begon de haptic device te oscilleren. De kracht die aangelegd wordt bij de bal wordt berekend volgens volgende formule: ~ F~ = s · (T cs · d)
(4.7)
Waarbij s een sterkte constante is om de kracht sterker of zwakker te maken, en T cs de camera-naar-standaardbasis transformatie matrix is (zie sectie 4.5). Er moet nog voor gezorgd worden dat deze kracht geen effect heeft in de Y-richting. Dit gebeurt door de Y component van de kracht op nul te zetten. Indien de gebruiker voor een moment de bal niet wilt laten bewegen, is het nogal moeilijk om de haptic interface point precies op het neutraal punt te houden. Voor deze rede moet de grootte van de uitwijking eerst een kleine drempel waarde overschrijden vooraleer deze kracht ook effectief bij de bal aangelegd wordt.
4.6.2
Snelheid van de bal
Hoewel de Y-richting genegeerd wordt voor bij de bal besturing, wordt deze toch nog gebruikt bij de force feedback. Het zou interessant zijn om de haptic interface point mee te laten bewegen met het bewegingen van de bal (zie figuur 4.6). Als de bal aan het vallen is, zou de haptic interface point ook naar beneden moeten bewegen. Als de bal naar omhoog vliegt, zou de haptic interface point ook naar omhoog moeten gaan. Een manier om dit te verwezenlijken is door gebruik te maken van de huidige snelheidsvector van de bal. Deze vector wijst waarnaar de bal het volgende moment zal bewegen. Deze snelheidsvector kan gezien worden als een uitwijking ten opzichte van de oorsprong, dat de haptic interface point moet nabootsen. Als deze uitwijking gezien wordt als een punt, dan kan dit ingesteld worden als het neutraal punt van de permanente veerkracht, dat gebruikt wordt bij de basis besturing van de bal (zie sectie 4.6.1). De oorsprong (~ porigin ) van de veerkracht wordt dan als volgt berekend: p~origin = l · (T sc · ~vball )
(4.8)
Waarbij l een constante is om de snelheidsvector grootte te mappen met een overeenkomstige uitwijking in de haptic workspace, T sc de standaard-naar-camerabasis transformatie matrix is (zie sectie 4.5), en ~vball de huidige snelheid van de bal. Om de verandering in Y richting goed te voelen, wordt de Y component van de oorsprong meer geaccentueerd. De X en Z richting kan best niet te veel geaccentueerd worden, anders ligt de oorsprong te fel aan
28
B Bal A
C
Bal
Bal
HIP HIP
HIP A
B
C
Figuur 4.6: Invloed van de snelheidsvector van de bal. de rand van de haptic workspace. Dit maakt het moeilijker om vrij te bewegen. Deze accentuering kan gebeuren door de constante l te zien als een 3 dimensionale constante, waarbij de Y component een veel grotere waarde heeft. Omdat de update rate van de physics stukken trager is dan die van de haptics, zal de huidige snelheidsvector voor een paar haptic iteraties hetzelfde blijven, en dan pas veranderen. Normaal gezien verandert de snelheidsvector van de bal geleidelijk aan, maar bij botsingen met de grond kan deze plots sterk veranderen, wat schokkerig kan over komen bij de gebruiker. Dit is vooral op te merken wanneer de bal een helling omhoog rolt. Doordat de ondergrond niet perfect effen is, maar bestaande uit ruwe polygonen, begint de bal een herhalend proces waarbij hij even in de lucht vliegt, en vervolgens terug op de grond valt. Dit geeft een snelheidsvector die constant omhoog en omlaag beweegt. Dit voelt aan net zoals een zaagtand. Om dit probleem op te lossen werd er gekozen om naar de uiteindelijke snelheidsvector over te gaan in stappen. Dit zorgt ervoor dat de snelheidsvector niet te snel verandert, wat zachter aanvoelt. Om van een huidige vector ~vcurrent , naar een doel vector ~vtarget over te gaan met een snelheid dspeed , wordt volgend algoritme gebruikt: Algorithm 1 Berekening van graduele verschuiving van een vector naar een doel vector. ~vdirection ← ~vtarget − ~vcurrent if ||~vdirection || < dspeed then ~vcurrent ← ~vtarget else direction ~vcurrent ← ~vcurrent + ||~~vvdirection || · dspeed end if
29
4.6.3
Profiel van de ondergrond
Het zou ook interessant zijn om de gebruiker bewust te maken van het profiel van de ondergrond waar de bal op rolt. Wanneer de gebruiker de bal een helling omhoog rolt, zou dit meer moeite moeten kosten dan een helling omlaag rollen. Het is mogelijk de veerconstante te veranderen van de permanente veerkracht, die gebruikt wordt bij de basis besturing van de bal (zie sectie 4.6.1), zodat deze sterker of zwakker wordt afhankelijk van het profiel van de ondergrond. Afhankelijk van de kant van de uitwijking van de haptic interface point, wordt de ene kant versterkt, en de andere kant verzwakt. Bijvoorbeeld, als de bal een helling omhoog rolt naar rechts, moet de veerkracht sterker worden indien de gebruiker de haptic interface point laat uitwijken naar rechts, en zwakker worden in de andere kant. In figuur 4.7 komt dit overeen met geval (b). In deze figuur wordt de invloed van het profiel op de veerkracht in de X richting (Fx ) weergegeven, in 3 verschillende gevallen. Om het eenvoudig te houden werd enkel de X dimensie afgebeeld. Het eerste geval is een helling met een normaal naar links, dan een horizontaal vlak, en als laatste geval een helling met een normaal naar rechts. De uitwijking van de haptic interface point in X richting (dx ) is negatief indien deze uitwijkt naar links, en positief naar rechts.
Bal -0.1
0
0.1
-0.5
Bal
Bal
0.5
1
Nx
-1
x
(a) Grondprofiel met voorgestelde normalen op X-as
−1
0
1
dx
0
1
dx
Fx
0
−1 −1
1
dx Fx
Fx
Nx = −1
Nx = 1
Nx = −0.5 Nx = −0.1
Nx = 0.5 Nx = 0
Nx = 0.1
(b) Invloed van de normaal naar(c) Geen invloed van de normaal(d) Invloed van de normaal naar links naar omhoog rechts
Figuur 4.7: Invloed van het grondprofiel op de veerkracht.
30
De veerconstante k van de veerkracht moet vermenigvuldigd worden met een 3 dimensionale constante kslope , zodat de krachten in X en Z richting kunnen versterkt of verzwakt ~ ) en de kant van worden. Deze constante, die afhankelijk is van de normaal van het profiel (N ~ wordt als volgt berekend: de huidige uitwijking (d),
Waarbij w een sterkte constante is om de normaal zwakker of sterker te maken. Zoals te zien in de formule, zorgt de constante kslope ervoor dat de veerkracht in de X en Z richting vermenigvuldigd of gedeeld wordt door een factor die proportioneel is met de normaal. In de Y richting wordt de veerkracht niet veranderd. Er wordt gekeken naar het teken van zowel de normaal als de uitwijking van de haptic interface point, om te beslissen als de constante versterkend of verzwakkend moet werken. Telkens wanneer de bal botst met de grond, wordt de normaal hiervan opgevraagd. Het is mogelijk dat de bal botst met verschillende contactpunten tegelijk, en in dit geval wordt de gemiddelde normaal berekend van alle contactpunten. Vervolgens wordt deze normaal uitgedrukt ten opzichte van de standaardbasis (zie sectie 4.5). Met andere woorden: ~ = T sc · ~cnormal N
(4.10)
~ de normaal is ten opzichte van de camera basis, T sc de standaard-naarWaarbij N camerabasis transformatie matrix is, en ~cnormal de normaal ten opzichte van de standaardbasis. Net zoals het geval van de snelheidsvector bij sectie 4.6.2, wordt de normaal traag geupdate ten opzichte van de haptic loop. Verder, omdat het model nog steeds uit ruwe polygonen bestaat, verandert de normaal enkel wanneer de bal over de volgende polygon rolt. Dit voelt schokkerig aan bij de gebruiker. Dit werd op dezelfde manier opgelost zoals in sectie 4.6.2, door gradueel naar de doel normaal over te gaan. Alleen wordt hier de normaal elke iteratie ook genormaliseerd. Een bijkomstig probleem is beslissen wat de normaal is indien de bal vliegt. Indien er geen contact is met de grond voor ongeveer ´e´en seconde, wordt ervoor gezorgd dat er geen invloed meer is van de ondergrond, door de normaal die overeenkomt met een horizontaal vlak in te stellen.
4.6.4
Botsingen
Botsingen van de bal met de ondergrond worden ook geaccentueerd voor de gebruiker in de vorm van een trilling. Wanneer de bal botst, worden alle contactpunten bekeken, en enkel het contact met de grootste impact snelheid wordt gebruikt om een kracht te genereren. Er moet minstens een minimum snelheid zijn vooraleer er effectief een kracht gegenereerd wordt.
31
De normaal van dit contactpunt bepaalt in welke richting de kracht gegenereerd wordt, en de impact snelheid de sterkte ervan. De trilling die gegenereerd wordt (zie figuur 4.8), is een gedempte oscillatie, die als volgt berekend wordt: F~ = s · cspeed · cos(ω0 · t) · (T sc · ~cnormal ) (4.11) Waarbij: • s: Een constante om de trilling sterker of zwakker te maken. • cspeed : De snelheid van de impact. • ω0 : De snelheid waarmee de oscillatie moet gebeuren. • t: De tijd (deze wordt telkens vermeerderd met 1 elke haptic iteratie). • T sc: De standaard-naar-camerabasis transformatie matrix. • ~cnormal : De normaal van het contact punt. Voor de demping van de oscillatie wordt de constante s telkens verminderd met een bepaalde constante cdecay , totdat deze gelijk aan nul is.
t
Figuur 4.8: Gedempte oscillatie.
4.7
Conclusie
Haptic rendering is zeker een fenomeen waarmee rekening moet gehouden tijdens de planning en ontwikkeling van een game. Zeker als er maximaal gebruik van haptics gemaakt wil worden. De beschikbare toolkits hebben hun voordelen en nadelen, en er bestaat geen toolkit die voor alle situaties de beste is. De eigen spelimplementatie maakt gebruik van kracht effecten die niet veel rekentijd nodig hebben, waardoor de haptic rendering stabiel bleef op de aangeraden update rate. Het gebruik van haptics bij de eigen spelimplementatie geeft het spel een meer realistische besturing, en laat de speler de interacties die gebeuren in het spel ook effectief voelen. Dit maakt het spel plezierig om te spelen, en geeft een nieuwe sensatie aan de speler.
32
Hoofdstuk 5
Conclusie Tegenwoordig is de term haptics niet zo bekend voor de gewone gebruiker. Toch wordt er veel gebruik gemaakt van haptics, zoals oa. bij simulators, trainingen, onderzoek en besturing van robotica op afstand. In de Game Developer Conference 2006 speech van Satoru Iwata, de president van Nintendo, wordt er gesuggereerd dat er een nood is aan innovatie in de gaming entertainment sector [34]. De Nintendo Wii brengt zo een innovatie door een nieuwe ervaring in game input, dat de beweging van de speler volgt in 6 DOF. Volgens de auteur is de volgende stap in innovatie het gebruik van haptics in games. De haptic interfaces van tenminste 3 DOF, zoals de Phantom, bleven meestal in academische kringen. Met de komst van de Novint Falcon, dat de focus legt op haptics en gaming, en dit ook effectief aan de man brengt, wordt hier verandering in gebracht. Novint ontwikkelt ook zelf games voor de Falcon, en brengt ook mods uit voor bestaande games zodat deze ook gebruik maken van haptics, met vele positieve reacties. Een eigen spel ontwikkelen is geen sinecure. De game engine die ontwikkeld werd voor de eigen spelimplementatie is heel flexibel en door de combinatie van de component structuur en scripting kan dezelfde game engine gebruikt worden om heel andere spellen te bouwen. Bij de ontwikkeling van een spel dat gebruik maakt van haptics zijn er enkele uitdagingen, wat de ontwikkelaar mogelijk kan ontmoedigen. Haptics moeten vooral veel meer dan graphics geupdate worden, en de haptic algoritmes die gebruikt worden mogen niet te cpu intensief zijn, anders kan dit mogelijk de performantie aantasten. Er zijn toolkits beschikbaar voor haptics, maar geen toolkit is de beste in alle situaties. Het gebruik van haptics in games zorgt voor een heel nieuwe entertainende sensatie bij de gebruiker [32], en de auteur gelooft dat in de toekomst haptics een belangrijke rol gaat spelen bij games.
33
Bibliografie [1] B. Insko, 2001. Passive Haptics Significantly Enhance Virtual Environments. PhD thesis, University of North Carolina. Department of Computer Science [2] Miguel A. Otaduy, Ming C. Lin. Introduction to Haptic Rendering. University of North Carolina. Department of Computer Science [3] K. Salisbury, D. Brock, T. Massie, N. Swarup, C. Zilles, 1995. Haptic rendering: Programming touch interaction with virtual objects. In 1995 Symposium on Interactive 3D Graphics [4] D. Morris, N. Joshi, K. Salisbury. Haptic Battle Pong: High-Degree-Freedom Haptics in a Multiplayer Gaming Environment. [5] S. Andrews, J. Mora, J. Lang, W.S. Lee. HaptiCast: A Physically-Based 3D Game with Haptic Feedback. SITE, University of Ottawa. [6] Game Programming Gems 6, 2006. Game Object Component System. p393-403 [7] P. Porta, 2007. Extending an Haptic API. Universiteit Hasselt. [8] T. Anderson, 1998. Flight: An advanced human-computer interface and application development environment. Master’s thesis, University of Washington [9] P. Jorissen, 2008. Dynamic Interactions for Networked Virtual Environments, Chapter 15: A Physical Travel Method Enabling Haptic Force Feedback, PhD thesis, Universiteit Hasselt. [10] F. Conti, F. Barbagli, R. Balaniuk, M. Halg, C. Lu, D. Morris, L. Sentis, E. Vileshin, J. Warren, O. Khatib, K. Salisbury, 2003. The CHAI libraries. Computer Science Department, Stanford University. [11] Max Smolens, Haptic Rendering, Course Note, laatst bezocht 14 augustus 2008. http://www.cs.unc.edu/˜lin/COMP259-S03/LEC/20a.ppt. [12] Haptic Battle Pong, laatst bezocht 14 augustus 2008. http://techhouse.brown.edu/˜dmorris/haptic.battle.pong.
34
[13] HaptiCast, laatst bezocht 14 augustus 2008. http://sourceforge.net/projects/hapticast. [14] H3DAPI, laatst bezocht 14 augustus 2008. http://www.h3dapi.org. [15] OGRE3D, laatst bezocht 14 augustus 2008. http://www.ogre3d.org. [16] OpenAL, laatst bezocht 14 augustus 2008. http://www.openal.org. [17] Newton Game Dynamics, laatst bezocht 14 augustus 2008. http://www.newtondynamics.com. [18] CHAI3D, laatst bezocht 14 augustus 2008. http://www.chai3d.org. [19] Squirrel, laatst bezocht 14 augustus 2008. http://www.squirrel-lang.org. [20] ZThreads, laatst bezocht 14 augustus 2008. http://zthread.sourceforge.net. [21] Libsigc++, laatst bezocht 14 augustus 2008. http://libsigc.sourceforge.net. [22] Nintendo 64, Rumble Pak, laatst bezocht 14 augustus 2008. http://www.nintendo.com.au/n64/accessories/index.php. [23] SensAble, laatst bezocht 14 augustus 2008. http://www.sensable.com. [24] SenseGraphics, laatst bezocht 14 augustus 2008. http://www.sensegraphics.com. [25] Immersion, laatst bezocht 14 augustus 2008. http://www.immersion.com. [26] Novint Technologies, laatst bezocht 14 augustus 2008. http://www.novint.com. [27] Nintendo Wii, laatst bezocht 14 augustus 2008. http://www.nintendo.com/wii.
35
[28] Nintendo DS, laatst bezocht 14 augustus 2008. http://www.nintendo.com/ds. [29] P5 Glove, CyberWorld, Inc., laatst bezocht 14 augustus 2008. http://www.cwonline.com/store/view product.asp?Product=1179. [30] P5 Virtual Controller Bundle Glove Review, 2003, laatst bezocht 14 augustus 2008. http://pc.gamezone.com/gzreviews/r21058.htm. [31] G. Block, IGN: Novint Falcon Review, laatst bezocht 14 augustus 2008. http://gear.ign.com/articles/833/833067p1.html. [32] J. Martin, Bit-tech: Novint Falcon Limited Edition, laatst bezocht 14 augustus 2008. http://www.bit-tech.net/gaming/2007/12/07/novint falcon limited edition. [33] Trolltech, Qt Signals and Slots, laatst bezocht 14 augustus 2008. http://doc.trolltech.com/4.0/signalsandslots.html. [34] S. Carless, Gamasutra: GDC - Detailed Nintendo Keynote Coverage, 2006, laatst bezocht 14 augustus 2008. http://doc.trolltech.com/4.0/signalsandslots.html.
36
Bijlage A
Lijst van componenten • AnimationTimer component: Stelt een timer voor die aan slaat wanneer er een grafische frame getekend wordt. • AudioSource component: Stelt een audio bron voor geluiden kan afspelen. • Body component: Stelt een lichaam voor in de fysieke wereld. • BodyController component: Een component die een Body kan laten bewegen volgens toetsenbord of haptics. • BodySpringController component: Een component die een veerkracht controleert volgens een Body. • CountSignal component: Stelt een signaal voor dat een numerieke waarde heeft. • CountSignalMonitor component: Een component die kan luisteren naar een CountSignal. • Gui component: Stelt een GUI onderdeel voor. • Joint component: Stelt een fysieke joint restrictie voor. • KeyboardBindMapper component: Een component die een signaal uitstuurt wanneer een toets wordt ingedrukt. • Light component: Stelt een grafisch licht voor. • MeshAnimation component: Stelt een grafische mesh animatie voor. • MeshGraphic component: Stelt een 3D grafische mesh voor, die met een SceneNode gekoppeld is. • Motor component: Stelt een constante MeshGraphic rotatie of Body rotatie voor. • ParticleSystem component: Stelt een grafisch particle system voor.
37
• PhysicsSynchronizer component: Een component die een MeshGraphic met een Body synchronizeerd. • SceneController component: Een component die een GameScene beheerd. • SceneNode component: Stelt een knoop in de grafische wereld voor. • Script component: Stelt een script voor. • Signal component: Stelt een signaal voor van een groep gameobjects. • SignalMonitor component: Een component die kan luisteren naar een Signal. • SpringForce component: Stelt een veerkracht voor in de haptics wereld. • ThirdPersonCamera component: Stelt een 3de persoon camera voor. • Timer component: Stelt een timer voor. • VibrationForce component: Stelt een vibratie kracht voor in de haptics wereld.