首页 > 解决方案 > 在 UE4 中将 nDisplay 与 Vive 追踪器一起使用

问题描述

对于一直在使用 nDisplay 和 vive 跟踪器的任何人,我都有一个问题。

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

DisplayClusterRootActor 蓝图子类的屏幕截图

我把 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-engine4unreal-blueprint

解决方案


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

问题是,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));
}

推荐阅读