为什么我的固定全息图不随头部移动而缩放?

时间:2019-05-19 16:36:59

标签: directx c++-cx hololens

我正在使用固定的参照系放置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硬件的用户向后退了几米:

Person takes a few steps back

他们应该看到的是一个较小的球体: Smaller sphere

我也在这里的Microsoft示例中观察到了这一点:

https://github.com/microsoft/Windows-universal-samples/tree/master/Samples/BasicHologram

当我向后移动时,立方体旋转但不会改变大小。

1 个答案:

答案 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()

为我提供了“世界锁定”坐标系。

在我的辩护中,我认为;>)到处都是“平稳”一词,这有点令人困惑,需要小心。我正在更改自己的代码,以确保使用“世界”和“耳机”来引用坐标系,以帮助避免混淆...

希望我的回答会帮助其他人。...