unity3d - 如何使用统一和 ARKit 将位置转换为应用程序的起点?
问题描述
试图开发一个 AR 应用程序。当应用程序打开时,设备位置是 (0,0,0),如果我打印或显示我的坐标,它将是 (0,0,0)。我想在门的入口处创建一个起点。当其他用户使用我的应用程序可以在任何地方打开应用程序时。
我想要做的是我已经在门的入口处保留了一个 AR。用户在成为他们起点的随机位置打开应用程序,所有 AR 对象都会出现。当他们通过 AR 对象时,我想要的坐标他们的设备是(0,0,0)。但是如果我在统一编辑器中运行以下代码,它会将相机带到应用程序启动的位置。我希望将入口位置转换为应用程序起点。
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);
}
_
编辑:
上面的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
推荐阅读
- javascript - 按未知键的值对对象数组进行排序
- android - ADB 命令以 HH:MM:SS.SSSS 显示时间格式
- node.js - 使用 express-formidable npm 包访问表单数据但出现错误。?
- reactjs - 指定货币 SGD 的 PayPal API
- python - 向 Django AppConfig 添加标签会导致迁移错误
- javascript - 反应滚动到顶部在另一台计算机上不起作用
- app-store - How to apple developer organisation name to nickname in individual?
- reactjs - "Apply() is only allowed in ready status" (unhandled runtime error)
- java - JTable 自定义渲染器不改变颜色
- spring - using Flyway for MongoDb in Spring