首页 > 解决方案 > 如何使用统一和 ARKit 将位置转换为应用程序的起点?

问题描述

试图开发一个 AR 应用程序。当应用程序打开时,设备位置是 (0,0,0),如果我打印或显示我的坐标,它将是 (0,0,0)。我想在门的入口处创建一个起点。当其他用户使用我的应用程序可以在任何地方打开应用程序时。

我想要做的是我已经在门的入口处保留了一个 AR。用户在成为他们起点的随机位置打开应用程序,所有 AR 对象都会出现。当他们通过 AR 对象时,我想要的坐标他们的设备是(0,0,0)。但是如果我在统一编辑器中运行以下代码,它会将相机带到应用程序启动的位置。我希望将入口位置转换为应用程序起点。

            Camera.main.transform.position=new Vector3(0,0,0);

据我了解,如果我们在应用程序中更改相机的位置,它可能会显示故障

标签: unity3darkit

解决方案


你的问题很不清楚-.-

但是如果您尝试将相机重置为(0,0,0),同时将所有游戏对象保持在相同的相对位置,您可以尝试:

    var localToCamera = Camera.main.transform.worldToLocalMatrix;
    var obj = GameObject.FindSceneObjectsOfType(typeof(GameObject));
    foreach (var o in obj)
    {
        var go = (o as GameObject);
        go.transform.FromMatrix(localToCamera * go.transform.localToWorldMatrix);
    }

_

编辑:

上面的UGLY代码应该做什么:它将爬过所有游戏对象并重新定位它们,如果您将相机设置为位置 (0,0,0) 并面向 (0,0,1),它们将相对于相机保持相同的位置和方向。

请注意,执行此代码后,相机本身将重新定位到(0,0,0)并面向(0,0,1),因为

Camera.main.transform.worldToLocalMatrix * localToWorldMatrix == 身份

编辑

我不能把这段代码放在评论中,因为它太长了。

尝试

// code from the top of my head here, syntax or function names might not be exact
var forward = arcamera.transform.forward;
forward.y = 0;
arcamera.transform.rotation = Quaternion.LookDirection(forward);
// now the camera forward should be in the (x,z) plane
UnityARSessionNativeInterface.GetARSessionNativeInterface().SetWorldOrigin(arcamera.transform);
// since you did not tilt the horizontal plane, hopefully the plane detection still detected vertical and horizontal planes

推荐阅读