Hieronder een voorbeeld van een Scriptable Object (SO) welke de Vector3 informatie vasthoud en doorgeeft. Hiervan kunnen er meerdere geïnitialiseerd worden, om bijvoorbeeld een Vector3 SO te hebben voor de linkerarm, de rechter schouder en het middenrif.
Op deze zelfde manier zijn SOs gemaakt welke een boolean meegeven, om aan te geven dat er een stap gezet is en SOs welke enums meegeven, zodat aangegeven kan worden of de speler in balans staat, of dat deze naar links of rechts leunt en of de speler zit of staat.
//Special event that sends a Vector3 on invocation.
public class Vector3Event : UnityEvent<Vector3>{ }
[CreateAssetMenu(fileName = "Vector3Variable", menuName = "DataParsers/Vector3Variable", order = 1)]
public class Vector3Variable : ScriptableObject, ISerializationCallbackReceiver
{
#region Variables
/// <summary>
/// The initial value for this SO.
/// </summary>
[SerializeField] private Vector3 InitialValue;
/// <summary>
/// The current value for this SO.
/// </summary>
[NonSerialized] public Vector3 RuntimeValue;
/// <summary>
/// Event that is called whenever the runtime value is changed.
/// </summary>
[HideInInspector] public Vector3Event OnChange = new Vector3Event();
#endregion
#region Event Methods
/// <summary>
/// Lets the SO know the value has changed.
/// </summary>
/// <param name="newValue">The new value for the SO to let all it's listeners know. </param>
public void ChangeValue(Vector3 newValue)
{
RuntimeValue = newValue;
if (OnChange != null)
{
OnChange.Invoke(RuntimeValue);
}
}
/// <summary>
/// Adds a listener to this SO's event.
/// </summary>
/// <param name="action">Function to call on invoking the SO's event.</param>
public void AddListener(UnityAction<Vector3> action)
{
OnChange.AddListener(action);
}
/// <summary>
/// Removes a listener from this SO's event.
/// </summary>
/// <param name="action">Previous used function used by AddListener.</param>
public void RemoveListener(UnityAction<Vector3> action)
{
OnChange.RemoveListener(action);
}
#endregion
}
De systemen die data willen ontvangen kunnen hier simpelweg op 'subscriben'.
void Start(){
vector3Variable.AddListener(NewPosition);
}
De systemen die data willen versturen hoeven alleen een methode aan te roepen.
private void Update(){
foreach (DataBinding databinding in dataBindings){
databinding.vector3Variable.ChangeValue(databinding.bodyPart.transform.position);
}
}
Er is een prototype project opgezet voor OpenPose. Bij dit prototype wordt gebruik gemaakt van de officiële OpenPose plugin.
Dit prototype is opgezet voor het testen van de bewegings ontwerpen, welke te vinden zijn op de ontwerppagina.
Dit prototype is live getest in een boven water omgeving. Maar door problemen met het rechtstreeks verbinden van de onderwater camera met een pc, is voor de onderwater testen gebruik moeten maken van video's. Hierdoor loopt het Unity beeld iets achter op de werkelijkheid, dit is niet het geval bij live testen.
Er zijn verschillende prototype scripts opgezet met OpenCV. Doordat ik zelf weinig kennis heb van Python, Visual Tracking en AI is bij deze prototypes puur gekeken naar de haalbaarheid van verschillende mogelijkheden in een onderwater en boven water omgeving.
Deze prototypes zijn live in een boven water omgeving getest, maar door problemen met het verbinden van de onderwater camera met de computer, zijn de onderwater testen gedaan via een video. Hierbij is opgemerkt dat de video van de AI trager verloopt dan wanneer deze live getest wordt.
Bijgeleverd bij OpenCV zitten een paar voorgetrainde AI, voor het traceren van iemands gezicht, of onderlijf. Bij dit prototype is gebruik gemaakt van de AI voor het herkennen van een onderlijf. Deze AI tekent een rood vierkant om het onderlijf van personen.
Hierbij was het van belang om te kijken of deze problemen ondervindt in een onderwater omgeving, of deze het bovenlijf nodig heeft om correct te werken en of de stroming storing veroorzaakt.
Gebaseerd op deze resultaten kan in een toekomstig onderzoek gekeken worden naar het traceren van elk been apart, of het herkennen van lopen of zitten.
Als kleurherkenning goed werkt, kunnen kleuren gebruikt worden om objecten, zoals gekleurde banden of handschoenen, gebruikt worden lichaamsdelen van een speler te traceren. Hiervoor is een script opgezet welke een vooraf gegeven kleur pakt en deze als een object ziet. Hier tekent deze een cirkel omheen en meet de beweging van dit object.
Met dit prototype wordt gekeken of verschillende kleuren herkent kunnen worden in een onderwater omgeving. Hierbij wordt dus gekeken of het water storing veroorzaakt voor het herkennen van kleuren, buiten de normale verkleuring die al plaatsvindt onderwater.
Er zijn hier 3 testen voor uitgevoerd met verschillende kleuren, zodat het kleurenspectrum op een redelijk niveau bekeken wordt. De gekozen kleuren zijn paars, rood en groen. 2 hiervan zijn basiskleuren, er is gekozen voor paars ipv. blauw omdat het water zelf al een blauwe omgeving veroorzaakt.
Er is een Unity project opgezet welke gebruik maakt van de officiële Kinect for Unity plugin.
Omdat het niet mogelijk is voor de Kinect 2 om onderwater gehouden te worden, is bij dit prototype gekeken naar hoe de Kinect werkt en of deze in een boven water omgeving werkt, terwijl de speler in het water staat.
Omdat de Kinect met infrarood stralen werkt, is verwacht dat deze niet in een onderwater omgeving zal werken, zelfs als deze met een waterdichte behuizing in het water te plaatsen is.
Het concept van Burger Maker is gerealiseerd. Hierbij zijn een aantal veranderingen aangebracht tijdens development en na feedback van experts.
Het bord voor de hamburger is naar het midden van het scherm verplaatst, zo kunnen beiden armen goed bij het bord zonder dat de linkerarm onnodig ver hoeft te bewegen.
Er wordt nu getoond wat er als volgende ingrediënt op de burger geplaatst moet worden, dit was soms moeilijk te zien op het plaatje van de hamburger.
Prullenbakken toegevoegd waar de speler aparte ingrediënten mee kan wegdoen.
Alle UI elementen zijn verstelbaar, zo kan de begeleider de ingrediënten net buiten afstand van de speler plaatsen.
De gril is er uitgehaald. Doordat de UI een aantal aanpassingen moest ondervinden, was hiervoor nu geen plek meer voor. Ook was dit een object waar de gebruiker veel omheen zou moeten bewegen en over het algemeen een element was welke de gebruiker onnodige stress kan geven, als deze nog niet goed zijn of haar armen kan bewegen.
Er is een testplan opgesteld waarmee de bovengenoemde prototypes van OpenPose, OpenCV en Kinect getest zijn in een boven water en onderwater omgeving. Door problemen met het verbinden van de onderwater camera met de computer, zijn deze testen uitgevoerd aan de hand van video's. Dezelfde resultaten zullen zichtbaar zijn wanneer deze live getest worden met een onderwater camera. Dit testplan is hier te vinden.
De spellen zijn getest in een live omgeving met een testpersoon van buiten het project welke zelf een revalidant is. Deze test is uitgevoerd op 1 Oktober 2020. Naderhand is gevraagd aan de testpersoon om een vragenlijst in te vullen.
Alle bewegingen zijn getest en werken, hierbij is de enige storende factor het wateroppervlak. Zodra de camera hier doorheen moet kijken, gaat het fout. Dit is goed zichtbaar in het filmpje bij de Kinect test, welke van boven het water het onderlichaam probeert te herkennen, maar door de reflectie en dieptesensor gaat het helemaal verkeerd.
Ondanks dat de onderwater testen met video's gedaan zijn, in plaats van live, is wel aan te tonen dat het technisch haalbaar is. Zodra als de koppeling tussen de onderwater camera en de computer lukt, dan zullen er geen problemen voor komen.
De spellen zijn positief ervaren, de testpersoon begreep de spellen zonder al te veel uitleg en had tijdens het spelen niet door dat hij bezig was met trainingsoefeningen. Tijdens het burger maker spel was de testpersoon constant bezig met zijn handen te sluiten wanneer deze een ingrediënt probeerde te pakken en weer loslaten wanneer deze bij het bord aankwam, wat duidt dat de testpersoon degelijk in het spel opgenomen was en er sprake was van immersie.
De observator die bij deze test aanwezig was vanuit InnoSportLab, Maxime Verdijk, heeft de belangrijkste vindingen genoteerd. Deze zijn hier te vinden.
Gebaseerd op deze resultaten is een advies gevormd.