Unity3d 如何使用unity和ARKit将位置转换为应用程序的起点?

Unity3d 如何使用unity和ARKit将位置转换为应用程序的起点?,unity3d,arkit,Unity3d,Arkit,正在尝试开发AR应用程序。当应用程序打开时,设备位置为(0,0,0),也就是说,如果我打印或显示我的坐标,它将为(0,0,0)。我想创建一个起点,就像在门的入口处一样。当使用我的应用程序的其他用户可以在任何地方打开应用程序时 我想做的是,我已经在门口放了一个AR。用户在任意位置打开应用程序,这将成为他们的起点,所有AR对象都会出现。当他们通过AR对象时,我希望他们设备的坐标为(0,0,0)但是如果我在unity editor中运行下面的代码,它会将相机带到应用程序启动的位置。我希望将入口位置转换

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

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

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

据我所知,如果我们在应用程序中更改摄像头的位置,它可能会显示出故障

您的问题非常不清楚--

但是,如果您尝试将相机重置为(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);
    }
_

编辑:

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

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

Camera.main.transform.worldToLocalMatrix*localToWorldMatrix==标识

编辑:

我无法将此代码放在注释中,因为它太长了

试一试


需要更好地理解这一点。你需要像保存检查点这样的东西吗?你玩,你到达位置B,你保存,当你重新打开游戏时,你想从位置B开始吗?不,对于AR应用,这是必需的。当我到达某一点时,我想将该点设置为起点,因此,如果我理解正确,你需要的是与你提供的相反的东西:移动整个场景,使相机位于
(0,0,0)
与移动的场景相关?@derHugo我想在经过游戏对象时添加一个游戏对象。它被触发,相机位置/用户位置必须在(0,0,0)处。类似于从该点开始的应用程序。我不想重新启动,但相机位置应该重置。那么,您当前的代码/hwat有什么问题吗?对不起,我还没有完全理解。。。你想将其设置为(0,0,0)还是正在寻找另一个职位?公平地说,这个问题并不十分清楚。。但你的答案也是如此。你能补充一些信息,解释一下这到底是做什么的,以及它应该如何解决这个问题吗?@Daveloper是的,好多了。不知道OP是否希望/需要这样做,但如果是这样的话,这似乎是一个很好的答案。所以我猜他确实想做我试图做的事情,除了我只处理虚拟对象,他实际上需要整个跟踪系统来执行坐标系更改。问题应该明确说明你是在使用ARKit还是ARCore或其他任何东西,这些框架肯定有执行这种坐标变化的基础设施。我想我想到了这篇文章。我想这就是我想要的。请检查setWorldOrgin@Daveloper知道如何从位置中减去并使该点成为原点。
// 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