我正在尝试使用 Unity 实现适用于 iOS 的 Azure 空间锚点应用程序。可悲的是,重新定位锚点的准确性还有很多不足之处,而且确实不一致。当我放置并锚定并尝试将其从放置它的完全相同的位置重新定位时,它要么根本找不到锚点,要么将其放置在距我最初放置它的位置几米远的地方。它也不是真正一致的,尝试从同一设备上的同一位置定位同一锚点每次都会给我不同的结果(或者它只是找不到它)。
我已经尝试解决这个问题几天了,但我不知道该怎么办了。我试图用示例项目中的代码、不同的位置、不同的照明条件替换我自己的代码。没有什么能真正给我一致的体验。它背后似乎没有很多文档或庞大的社区,所以我找不到其他有这个问题的人。所以现在我不确定问题出在哪里:我的代码或只是空间锚仍在处理中。至少在主题演讲中,他们谈到了这项服务非常准确,并展示了它运行良好的示例。
就像我说的,我使用的代码非常接近示例项目。
首先,用户扫描环境,直到其“RecommendedForCreateProgress”达到 100%。然后他可以放置对象,更改其比例并将其保存到 SpatialAnchors 服务。
//...
//Placing/ Moving the anchor
if (localAnchor == null)
{
localAnchor = Instantiate(testPrefab, hitPosition, rotation);
localAnchor.AddARAnchor();
}
else
{
localAnchor.RemoveARAnchor();
localAnchor.transform.position = hitPosition;
localAnchor.transform.rotation = rotation;
localAnchor.AddARAnchor();
}
//...
//...
//Saving the anchor and its properties
Vector3 localScale = localAnchor.transform.localScale;
CloudSpatialAnchor cloudAnchor = new CloudSpatialAnchor();
cloudAnchor.AppProperties[@"scaleX"] = localScale.x.ToString();
cloudAnchor.AppProperties[@"scaleY"] = localScale.y.ToString();
cloudAnchor.LocalAnchor = localAnchor.GetNativeAnchorPointer();
await this.cloudSession.CreateAnchorAsync(cloudAnchor);
之后,ID 将保存在数据库中。如果用户在 CloudAnchor 附近,我会检查 GPS 位置,然后创建一个观察者。当观察者找到锚点时,我得到位置和旋转并在那里实例化我的对象。
private void AnchorLocated(AnchorLocatedEventArgs args){
//...
Pose anchorPose = args.Anchor.GetAnchorPose();
CreateGameObject(anchorPose.position, anchorPose.rotation, args.Anchor);
//...
}
private void CreateGameObject(){
GameObject anchorObject = Instantiate(anchorPrefab, position, rotation);
anchorObject.AddARAnchor();
//scaling object
}
缩放对象没有任何区别,即使我不使用它仍然不准确。我一直试图得到的不准确只是在厘米而不是米的范围内。将点云提高到 200% 也没有太大区别。