ViveInputUtility-Unity icon indicating copy to clipboard operation
ViveInputUtility-Unity copied to clipboard

ViveRole -> BodyRole -> Foots

Open ziiCz opened this issue 7 years ago • 5 comments

Hello!

I try to use the left foot and the right foot with Vive Trackers, but they are never assigned as foot. I use the BodyRole on them and assign the left and right foot on their GameObject.

This feature is operational or I forgot something?

Thank you in advance.

ziiCz avatar Mar 26 '18 12:03 ziiCz

Without bindings, BodyRole will only roughly mapping tracking devices according to their tracking position (related to hmd) whenever a controller or tracker is connected.

So either make sure your hmd and trackers are connected and in right position before game started playing, or call HTC.UnityPlugin.Vive.ViveRole.DefaultBodyRoleHandler.Refresh() manually to remapping BodyRole on demend.

But we recommended to use bindings anyway, is more convenience to setup tracking devices along with gears. Also see Binding Interface Release Note.

If you are using in product, you may not want to include our VIU style binding interface and binding config file, then you can design your own binding process for your user and apply those bindings manually by calling the following API:

HTC.UnityPlugin.Vive.ViveRole.GetMap<BodyRole>().BindDeviceToRole(string deviceSN, BodyRole role)

lawwong avatar Mar 27 '18 06:03 lawwong

Yeah, I'm sure that my hmd and trackers are connected before game start.

I think the problem comes from the IsFoot() function from the BodyRole class. This function already returns false.

I don't want to use bindings. I need the configuration to be done automatically at startup.

This is why I want to use the BodyRole class without default bindings.

I have called the HTC.UnityPlugin.Vive.ViveRole.DefaultBodyRoleHandler.Refresh() function but there was no change.

ziiCz avatar Mar 27 '18 07:03 ziiCz

I see.

You can customize auto-mapping logic by implementing ViveRoleHandler<EnumType> and replace the default handler by calling ViveRole.AssignMapHandler(). For Example:

using UnityEngine;
using HTC.UnityPlugin.Vive;

public class CustomBodyRoleHandler : ViveRole.MapHandler<BodyRole>
{
    // called when handler is assigned
    public override void OnInitialize() { RemapAll(); }
    // called when device connected or disconnected
    public override void OnConnectedDeviceChanged(uint deviceIndex, ETrackedDeviceClass deviceClass, string deviceSN, bool connected) { RemapAll(); }
    // called when binding changed (Ex. when ViveRole.GetMap<BodyRole>().BindRole called)
    public override void OnBindingChanged(MyEquipRole role, string deviceSN, bool bound) { RemapAll(); }
    // called when OpenVR TrackedDeviceRoleChanged event emitted
    public override void OnTrackedDeviceRoleChanged() { RemapAll(); }

    public void RemapAll()
    {
        // some auto mapping algorithm...
        // call protected function here to map/unmap relations
        // this.UnmappingAll() to unmap all relations
        // this.MappingRole(MyEquipRole role, uint deviceIndex) to map the role to the device
    }
}

public class BodyRoleHandlerReplacer : MonoBehaviour
{
    public readonly CustomBodyRoleHandler handler = new CustomBodyRoleHandler();

    public void Awake()
    {
        // Replacing DefaultBodyRoleHandler
        ViveRole.AssignMapHandler<BodyRole>(handler);
    }
}

lawwong avatar Mar 27 '18 08:03 lawwong

BTW, VIU only have roughly mapped BodyRole, may not work on certain cases. It will be very grateful if you share your BodyRoleHandler implementation to public.

lawwong avatar Mar 27 '18 14:03 lawwong

We agree that the BodyRole does not work completely. No problem, if I find a good implementation I will share it. Thank you for your answers.

ziiCz avatar Mar 28 '18 07:03 ziiCz