KONZEPT

(Mockup des Konzepts)

Die Erweiterung besteht aus 2 Komponenten: der physische Controller, welche die Daten an ein externes Program weitervermittelt und diese verarbeitet. Das externe Program steuert schließlich die externen Inputs des Spiels.

UMSETZUNG - ARDUINO

Als physischer Controller wurde ein handelsüblicher Golfschläger mit einem DOIT ESP32 ausgerüstet, welcher zusätzlich mit einem Gyrosensor und Joystickmodul ausgestattet ist. Die Module werden mit 3D-gedruckten Klammern und Magneten am Schläger fest verbunden und verrutschen selbst bei schnellen Bewegungen nicht.

Der Joystick wird für die Kamerasteuerung genutzt. Zusätzlich kann der Joystick „eingedrückt“ werden und somit als Knopf fungieren. Der Spieler kann damit die Aufnahme für eine Schlagbewegung starten.

Der Mikrocontroller verbindet sich mit einem lokalen Netzwerk und spannt einen kleinen Netzwerkserver auf, welcher bei Anfrage die aktuellen Messdaten innerhalb im JSON-Format übermittelt:

{"acc":[0.19,-0.05,0.10], "axis":[-0.90, -0.23, 0.31], "joystick":[1829, 567], "button":[1]}

UMSETZUNG - PYTHON

Ein Pythonskript greift konstant auf die Messdaten des Golfschlägers zu und verarbeitet diese. Aufgrund dessen, dass die Messdaten nur die Rotation und Beschleunigung des Golfschlägerendes gemessen werden, wird durch die räumliche Orientierung des gesamten Golfschlägers simplifiziert und jeglich durch Interpolation der Golfschlägerlänge von einem gesetzten Mittelpunkt berechnet.

Ein Visualisierungsfenster der Livedaten ermöglicht zusätzlich, die Daten visuell zu erkennen und bei der Bewertung der Messdaten genauere Aussagen zu tätigen.

Sobald der Knopfdruck des Joysticks getätigt wird, geht das Programm in die Golfschlagerkennung über. Diese ermittelt, ob der Nutzer erfolgreich ein Golfschlag ausgeführt hat, indem zwei Trigger erfolgreich erfüllt wurden.

A: Ausholen

Der Spieler hat für den Schlag ausgeholt. Der Trigger wird als erfüllt gezählt, wenn eine gewisse Höhe des Schlägers erreicht wurde, der Schläger angefangen hat sich wieder zu senken und dabei eine gewisse Grenzgeschwindigkeit erreicht wird.

B: Balltreffpunkt

Der Spieler würde nun den Ball schlagen. Der Trigger wird als erfüllt gezählt, wenn der Schläger nach unten zeigt, eine gewisse Geschwindigkeit erfährt und wieder beginnt nach oben zu wandern.

Sobald Trigger A als erfüllt gewertet wird, wird die Schlagkraft anhand der Schlägerhöhe bei Trigger A und der Geschwindigkeit bei Trigger B berechnet.

    windup-factor = [0.05 - 1.0]   
    impact-velocity-normalized = [1 - 2.5]
    velocity = impact-velocity-normalized * windup_factor

Die Schlagkraft wird dann an Unreal Engine weitergegeben.

UMSETZUNG - UNREAL ENGINE

Unreal Engine spannt bei Spielbeginn ein Websocket, auf welches das Pythonprogramm zugreift und über ein JSON-Format die Funktionen der Kamerabewegung und der Golfschläge ausführt.

Hierfür wurde ein eigener kleiner Blueprint-Node in C# geschrieben, welche das Websocket-Handling übernimmt und bestimmte Funktionen als Events bedient. Auf diese können dann im UE-Projekt verteilt verwendet werden, sowohl als Dauerfunktion (Kamerabewegung), als auch als Einzelfunktion mit Priorität (Schlagfunktion)

HERAUSFORDERUNGEN

Die größte Herausforderung stellte die Planung des Projektumfangs- und Struktur dar. Die einzelnen Komponenten für sich zu erarbeiten war bereits bekannt und stellte keine Probleme dar, die Kommunikation untereinander mithilfe von Websockets und Webserver war jedoch ein völlig neues Themengebiet und brauchte viel Recherche um ein Verständnis hierfür zu erhalten.

ABSCHLUSS

Das Projekt hat den Stand eines technischen Prototypen erreicht. Für eine angenehmere Spielerfahrung werden noch weitere Funktionen in den physikalischen Controller eingebunden, um vor allem alle anderen Elemente des Spiels neben der Hauptroutine bedienen zu können (Menu, Levelauswahl, ...).

Die Hardwareausstattung wurde in Zusammenarbeit mit einer Freundin erreicht. Geplant ist eine Revision des Schlägers mit genauerer Sensorik und stabilerer Übertragung, um zukünftig noch bessere Spielerlebnisse zu ermöglichen.

Mir hat das Projekt sehr viel Spaß und Freude bereitet! Es ist ein sehr witziges Gefühl, ein eigens programmiertes Spiel mit einem handelsüblichen Golfschläger bedienen zu können. Man braucht nur dringenst einen größeren Raum um nicht mehr Gefahr zu laufen verschiedenste Gegenstände als unfreiwillige Golfbälle mit durch den Raum zu schlagen...

Ich habe großes Interesse daran das Spiel weiter zu entwickeln und eventuell neben der physikalischen Steuerung auch eine Steuerung in VR zu ermöglichen, damit man nicht auf den Golfschläger der Zukunft angewiesen ist.