【问题标题】:Using nDisplay with Vive Trackers in UE4在 UE4 中将 nDisplay 与 Vive 追踪器一起使用
【发布时间】:2020-11-18 22:28:50
【问题描述】:

我有一个问题想问任何使用 nDisplay 和 vive 追踪器的人。

我使用 Ben Kidd's videos on youtube 和 nDisplay 新项目模板进行设置,并通过创建 DisplayClusterRootActor 的蓝图子类创建了这个蓝图:https://blueprintue.com/blueprint/fgg1zcub/

我把 GetVRPNTrackerLocation 不是一个函数归结为在不同版本的 UE (4.26) 中

在 VRPN 中,我从控制器(不使用跟踪器 atm)获取以下数据:

Tracker openvr/controller/LHR-F7FD3B46@192.168.0.41:3884, sensor 0:
        pos (-0.08,  0.78, -0.36); quat ( 0.20,  0.07, -0.15,  0.96)
Tracker openvr/controller/LHR-F7FD3B46@192.168.0.41:3884, sensor 0:
        pos (-0.08,  0.78, -0.36); quat ( 0.20,  0.07, -0.16,  0.96)
...

这是通过我的打印字符串来实现的

所以我知道数据是从控制器 -> VRPN -> UE4 / nDisplay 传递的,它看起来类似于 Ben 的(数字从 -2ish 到 2ish)

最后在我的 nDisplay cfg 中(连同我的显示器设置):

...
[camera] id="camera_static" loc="X=0,Y=0,Z=0" parent="eye_level" eye_swap="false" eye_dist="0.064" force_offset="0" tracker_id="ViveVRPN" tracker_ch="0"

[input] id="ViveVRPN" type="tracker"  addr="openvr/controller/LHR-F7FD3B46@192.168.0.41:3884" loc="X=0,Y=0,Z=0" rot="P=0,Y=0,R=0" front="-Z" right="X" up="Y"
...

但是摄像机的移动非常小,并不代表实际的摄像机移动。

【问题讨论】:

    标签: unreal-engine4 unreal-blueprint


    【解决方案1】:

    最后,这个问题不仅是我。

    问题在于,GetVRPNTrackerLocation 似乎只考虑第一个轴,将其分配给前面,并将其余轴设置为正 X。

    至于根本问题,我不知道这发生在哪里,但由于我需要快速修复,我只是将这些值硬编码到引擎代码中,并没有寻找更永久的修复。

    所以,如果你想解决这个问题,我就是这样做的:

    1. 按照这些步骤获取 Unreal 4.26 的源版本(我会推荐 4.26 分支) https://docs.unrealengine.com/en-US/ProductionPipelines/DevelopmentSetup/BuildingUnrealEngine/index.html
    2. 查找 {UnrealSourceFolder}\Engine\Plugins\Runtime\nDisplay\Source\DisplayCluster\Private\Input\Devices\VRPN\Tracker\DisplayClusterVrpnTrackerInputDevice.cpp
    3. 修改这两个方法
    
    FVector FDisplayClusterVrpnTrackerInputDevice::GetMappedLocation(const FVector& Loc, const AxisMapType Front, const AxisMapType Right, const AxisMapType Up) const
    {
        static TLocGetter funcs[] = { &LocGetX, &LocGetNX, &LocGetY, &LocGetNY, &LocGetZ, &LocGetNZ };
        //return FVector(funcs[Front](Loc), funcs[Right](Loc), funcs[Up](Loc));
        return FVector(funcs[AxisMapType::NZ](Loc), funcs[AxisMapType::X](Loc), funcs[AxisMapType::Y](Loc));
    }
     
    FQuat FDisplayClusterVrpnTrackerInputDevice::GetMappedQuat(const FQuat& Quat, const AxisMapType Front, const AxisMapType Right, const AxisMapType Up, const AxisMapType InAxisW) const
    {
        static TRotGetter funcs[] = { &RotGetX, &RotGetNX, &RotGetY, &RotGetNY, &RotGetZ, &RotGetNZ, &RotGetW, &RotGetNW };
        //return FQuat(funcs[Front](Quat), funcs[Right](Quat), funcs[Up](Quat), -Quat.W);// funcs[axisW](quat));
        return FQuat(funcs[AxisMapType::NZ](Quat), funcs[AxisMapType::X](Quat), funcs[AxisMapType::Y](Quat), -Quat.W);// funcs[axisW](quat));
    }
    

    【讨论】:

    • 感谢您的回复 - 我们已移至 LiveLinkXR 插件来管理此问题,并且运行良好
    • @obie,您是否找到任何有关将 LiveLink 与 ndisplay 结合使用的文档?我在编辑器中连接了它,但 ndisplay 没有显示任何动作。谢谢!
    【解决方案2】:

    所以我刚刚从正常工作的 4.25 版本升级到 4.26,然后遇到了同样的问题。然后,我构建了引擎并进行了调试,以找到此问题的原因和可能的解决方案。 似乎是 .cfg 文本文件和轴解析不正确的问题。

    一个简单的解决方案是将 .cfg 文件导入编辑器,然后将其转换为新的 .json 文件格式。然后,您可以在此处查看跟踪器上分配错误的轴的问题,也可以在新文件中进行更改。之后只需使用新的 .json 文件进行 ndisplay 配置,它应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 2017-07-18
      • 2022-07-26
      • 2011-11-18
      • 2019-04-29
      • 2020-06-14
      • 1970-01-01
      相关资源
      最近更新 更多