我正在使用固定的参照系放置Direct X球体。当我移动头部时,球形全息图会保持在原位。但是它没有规模。当我第一次使用PositionHologramAtGaze()放置它时,它会缩放(基于示例代码)。
在C ++ / Direct X中我必须处理缩放吗?
//下面的代码基于或与示例代码相同...
SpatialPointerPose^ pointerPoseStationary =
SpatialPointerPose::TryGetAtTimestamp(m_stationaryReferenceFrame-
>CoordinateSystem, prediction->Timestamp);
m_Sphere->PositionHologramAtGaze(pointerPoseStationary, 2.5f);
球体绘制得很好,并保持在固定的世界位置,但是当我将头/ hololens移到更远时,它不会缩放。
例如,在这张图片中,我们有一个人看着全息球Person wearing a hololens looking at holographic sphere
他们看到的是 Holographic Sphere as seen by wearer
现在,穿着hololens硬件的用户向后退了几米:
他们应该看到的是一个较小的球体: Smaller sphere
我也在这里的Microsoft示例中观察到了这一点:
https://github.com/microsoft/Windows-universal-samples/tree/master/Samples/BasicHologram
当我向后移动时,立方体旋转但不会改变大小。
答案 0 :(得分:0)
我找到了自己的答案。
HolographicFaceTracking示例使用相对于眼镜的坐标系。 281行 SpatialCoordinateSystem ^ currentCoordinateSystem = m_referenceFrame-
GetStationaryCoordinateSystemAtTimestamp(prediction-> Timestamp);
我误解了此方法,因为它获取了“固定”坐标,即“世界”坐标系。但是“固定”在这种情况下没有这个含义。
它并不能完全解释为什么多维数据集不会更改大小或进行反向缩放,但是,一旦我从BasicHologram示例中切换为使用此代码,就可以了:
// The simplest way to render world-locked holograms is to create a
stationary reference frame
// based on a SpatialLocator. This is roughly analogous to creating a "world"
coordinate system
// with the origin placed at the device's position as the app is launched.
m_stationaryReferenceFrame = m_spatialLocator-
>CreateStationaryFrameOfReferenceAtCurrentLocation();
然后
pose = SpatialPointerPose::TryGetAtTimestamp(m_stationaryReferenceFrame-
>CoordinateSystem, prediction->Timestamp);
切换到使用CreateStationaryFrameOfReferenceAtCurrentLocation()
为我提供了“世界锁定”坐标系。
在我的辩护中,我认为;>)到处都是“平稳”一词,这有点令人困惑,需要小心。我正在更改自己的代码,以确保使用“世界”和“耳机”来引用坐标系,以帮助避免混淆...
希望我的回答会帮助其他人。...