unreal-engine4 - 在 UE4 中将 nDisplay 与 Vive 追踪器一起使用
问题描述
对于一直在使用 nDisplay 和 vive 跟踪器的任何人,我都有一个问题。
我在 youtube 上使用 Ben Kidd 的视频和 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"
...
然而,相机的运动非常微小,并不代表实际的相机运动。
解决方案
最后,这个问题不仅是我。
问题是,GetVRPNTrackerLocation 似乎只考虑第一个轴,将其分配给前面,并将其余轴设置为正 X。
至于根本问题,我不知道这发生在哪里,但由于我需要快速修复,我只是将这些值硬编码到引擎代码中,并没有寻找更永久的修复。
因此,如果您想执行此解决方法,请执行以下操作:
- 按照以下步骤获取 Unreal 4.26 的源版本(我会推荐 4.26 分支) https://docs.unrealengine.com/en-US/ProductionPipelines/DevelopmentSetup/BuildingUnrealEngine/index.html
- 找到 {UnrealSourceFolder}\Engine\Plugins\Runtime\nDisplay\Source\DisplayCluster\Private\Input\Devices\VRPN\Tracker\DisplayClusterVrpnTrackerInputDevice.cpp
- 修改这两个方法
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));
}
推荐阅读
- html - 如何在选择选项框中自定义 css
- python - 如何动态选择 pytest 夹具?
- excel - 如何检测锁定的 VBA 项目是否可见
- python - 从另一个模型 django 导入变量
- jenkins-pipeline - 詹金斯:捕获错误以跳到下一阶段,但仍然显示错误阶段已失败
- visual-studio-code - 有没有办法在谷歌云外壳中使用 VS 代码插件?
- locust - 蝗虫 95 个百分位高于最大值
- kubernetes - NginxInc/kubernetes-ingress - 打开 portainer websocket 连接 - 传递标头
- windows - 当在其中创建新文件或文件夹时,Windows 上的文件夹如何同步到 AWS S3
- php - 如何使用ajax从引导模式中删除特定图像?