Oculus Quest - Motion Controller - Get Velocity

  • Hallo :)


    Ich bin gerade dabei mein erstes Projekt mit der Unreal Engine um zu setzten, quasi ein Lernprojekt :)

    Ich komme soweit auch ganz gut zurecht und mache Fortschritte.


    Ich habe folgendes vor:

    Ich möchte die Geschwindigkeit und Richtung des Motion Controllers nutzen um den Schaden an einem Objekt zu ermessen (je schneller ich mit dem Motion Controller auf das Objekt treffe, desto mehr Schaden wird verursacht ), wie ein Faustschlag quasi. Jetzt habe ich versucht dem Motion Controller über "Event tick" mit "get velocity" dazu zu bewegen mit "Print String" einen Output zu generieren dem ich dann eine Wertigkeit zuweisen kann.


    Allerdings hänge ich gerade bei folgendem Problem:

    Soweit funktioniert das auch bei allen Objekten die nicht in Verbindung mit den Motion Controllern stehen (z.b. eine Box die im Level fällt generiert mir einen Output), sobald ich das Objekt aber im Bereich der BP_MotionController einpflege, generiert es keinen Output mehr. Da ich die Bewegung bei den Motion Controllern abgreifen muss stehe ich grad auf dem Schlauch :(


    Hat da jemand eine Lösung für mich parat?


    Vielen Dank im Voraus :__

  • Hallo kyodai!


    Ich möchte die Lediglich einen Output generieren an dem ich den Schaden eines Schlages messen kann. Es ist also im Prinzip egal ob ich den Controller selbst oder die Box messe. Ich möchte halt mit dem Motion Controller der VR Brille zuschlagen und damit Schaden an einem Objekt machen, der Schaden soll dabei aber durch die Geschwindigkeit des Schlages ermittelt werden (Schneller zuschlagen = Mehr Damage am Objekt) :)

  • Halt doch die WorldPosition des Motion Controller in jedem Tick in ner Variable fest z.B. "letztePosition" und dann substrahierst du die aktuelle von der letzten Position, da haste die Geschwindigkeit. Danach überschreibste natürlich wieder letztePosition.

    Kleines Detail. Du musst noch diese DeltaPosition mit der DeltaTime dividieren, dann hast du die Geschwindigkeit, ansonsten wird das Verhalten FrameRate abhängig.

    Vielleicht könnte auch etwas smoothing/filtering nötig sein um hochfrequentes zittern wegzubekommen.

  • Sooooo, ich habe mal versucht das umzusetzen, leider ohne Erfolg :(


    Hier mal ein Screenshot von dem was ich gemacht habe (auf die Gefahr hin das ich mich blamiere :P )

    [Blockierte Grafik: https://de.imgbb.com/]


    die Variablen "OldPosition" und "NewPosition" geben mir auch einen Output, allerdings kann ich zwischen denen keinen Unterschied erkennen.


    Die Variable "geschw" bleibt konstant auf 0 bei allen werten.


    Kann es sein das es daran liegt das die "OldPosition" und die "NewPosition" gleichzeitig ticken und daher auch in die "geschw" nichts rein schreiben können?


    Vielen dank für eure Zeit :)

  • Ich glaube das Problem ist daß du alte und neue Position mit dem gleichen Wert setzt und im letzten Schritt diese vergleichst. Natürlich sind die immer gleich und das Ergebnis so null. Machs doch mal in der Abfolge so:


    1. "Alter Wert" minus die aktuelle Position (Die musst du nicht in 2 Variablen speichern, den aktuellen Wert hast du doch aus dem getworldlocation).

    2. Als Geschwindigkeit speichern.

    3. Jetzt erst schreibst du die Position in den "alten wert" (Den brauchst du ja jetzt nicht mehr).

  • Super!


    So funktioniert es :D, habe lediglich noch den Wert noch durch die Deltatime dividiert um (wie von Tomura vorgeschlagen) das Verhalten nicht abhängig von der Framerate zu machen.

    Kleines Detail. Du musst noch diese DeltaPosition mit der DeltaTime dividieren, dann hast du die Geschwindigkeit, ansonsten wird das Verhalten FrameRate abhängig.

    Vielleicht könnte auch etwas smoothing/filtering nötig sein um hochfrequentes zittern wegzubekommen.


    Habe versucht den Wert noch zu Filtern (Damit ich einfach ein klareres Bild vom Output habe), verstehe aber nicht so ganz wie das von statten geht.

    ist da "FInterpTo" der richtige weg?


    Vielen Dank für euren tollen Support :)


    PS: Mal eine Frage am rande, ist das der richtige Weg um das ganze zu lernen oder sollte ich das anders angehen?

  • Ich würde den Wert nicht mal Runden/Interpolieren solange der Spieler ihn nicht zu Gesicht bekommt - du brauchst ihn ja immer nur in dem einen bestimmten Frame wo eine Collission (Objekt wird getroffen) passiert und zu berechnen wie hart getroffen wurde.


    Framerate sollte in VR sowieso am besten sehr konstant sein - sonst hast du andere Probleme. Aber finde ich trotzdem gut daß du es wie von Tomura vorgeschlagen implementiert hast - er hat natürlich recht.



    Du machst das doch schon sehr gut finde ich. Wenn du dein Wissen verbreitern willst mach ml ein paar Youtube tutorials. Da lernst du viele Sachen wo du dir erst denkst "hmmm interessiert mich eigentlich gerade nicht so" aber später ist es dann doch oft nützlich wenn man es weiss.

  • Framerate sollte in VR sowieso am besten sehr konstant sein - sonst hast du andere Probleme. Aber finde ich trotzdem gut daß du es wie von Tomura vorgeschlagen implementiert hast - er hat natürlich recht.

    Je nach Gerät ist diese aber anders.

    Rift S = 80 Hz

    Quest = 72 Hz

    Index = 60, 90, 120, 144 Hz (je nach user einstellung)

    Vive = 90 Hz

    Rift = 90 Hz

    und dann noch das ganze WMR zeug.


    Auch könnte es ja diesen Modus geben wo das Spiel in halber Framerate läuft das Bild aber auf die doppelte künstlich interpoliert wird, weiß aber nicht mehr wie das Feature heißt.


    Generell solltest du probieren ob es ohne smoothing gut genug ist. Wenn du nicht weißt, was "gut genug" bedeutet, dann solltest du dir zuerst darüber Gedanken machen, das kannst nur du beantworten.

    Mit smoothing meine ich etwas was wie ein Tiefpass funktioniert (eine Art gewichteter Mittelwert über eine bestimmte Anzahl an Samples), falls z.B. zum Zeitpunkt der Kollision durch ein Zittern (Sensorungenauigkeit, Zittern, etc) dich interessiert ja eher die Bewegung auf der "Macro"-Ebene und nicht auf der "Micro"-Ebene.


    Wie gesagt, halte es erst so einfach wie möglich und denke darüber nach wie du den Erfolg oder die Güte deiner Arbeit feststellst. Damit hast du auch gleich einen richtigen Test und Erfolgs/Misserfolgskriterien definiert. Darauf basierend kannst du dann über weitere Maßnahmen nachdenken.