通过 Swift 设置 ARKit 方向
Posted
技术标签:
【中文标题】通过 Swift 设置 ARKit 方向【英文标题】:Setting ARKit Orientation via Swift 【发布时间】:2017-12-20 21:32:04 【问题描述】:我正在使用OpenGL
开发一个 ARKit 应用程序,因此直接使用 ARKit 而不是使用 SceneKit。
默认情况下,ARKit 设置为横向,但我无法找到任何文档或示例以旋转为纵向。 SceneKit 示例适用于纵向,但 Metal
示例仅适用于横向。
是否可以更改 ARKit 跟踪方向?
【问题讨论】:
带有 OpenGL 的 ARKit,一个有趣的星座。我会选择 OGL 而不是 Metal/SceneKit 以获得更好的便携性,但是,ARKit 已经将你锁定在 ios 上。 【参考方案1】:我能够在应用程序逻辑中通过将相机矩阵乘以根据设备方向旋转的四元数来解决此问题。
【讨论】:
@michaeltheory 我也会对此感兴趣的解决方案! @michaeltheory 能否请您在您标记后发布您的解决方案的代码?【参考方案2】:对 Objective-c 感到抱歉。
找到并重写这个
uniforms->viewMatrix = [frame.camera viewMatrixForOrientation:UIInterfaceOrientationLandscapeRight];
uniforms->projectionMatrix = [frame.camera projectionMatrixForOrientation:UIInterfaceOrientationLandscapeRight viewportSize:_viewportSize zNear:0.001 zFar:1000];
到
uniforms->viewMatrix = [frame.camera viewMatrixForOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
uniforms->projectionMatrix = [frame.camera projectionMatrixForOrientation:[[UIApplication sharedApplication] statusBarOrientation] viewportSize:_viewportSize zNear:0.001 zFar:1000];
和
CGAffineTransform displayToCameraTransform = CGAffineTransformInvert([frame displayTransformForOrientation:UIInterfaceOrientationLandscapeRight viewportSize:_viewportSize]);
到
CGAffineTransform displayToCameraTransform = CGAffineTransformInvert([frame displayTransformForOrientation:[[UIApplication sharedApplication] statusBarOrientation] viewportSize:_viewportSize]);
【讨论】:
【参考方案3】:目前在iOS 11 Beta
中,plane detection 只有水平表面跟踪。
默认情况下,平面检测是关闭的。如果启用水平面 检测,会话添加 ARPlaneAnchor 对象并通知您 ARSessionDelegate 、 ARSCNViewDelegate 或 ARSKViewDelegate 对象 每当其对捕获的视频图像的分析检测到一个区域 看起来是一个平面。
如果您需要垂直跟踪,请使用hitTest(_:types:) 函数自行完成。它允许您检查现实世界中的表面或物体。
命中测试搜索检测到的真实对象或表面 通过 AR 会话对相机图像的处理。一个二维点 图像坐标可以指沿 3D 线的任何点 从设备摄像头开始并沿由下式确定的方向延伸 设备方向和相机投影。此方法搜索 沿着这条线,按顺序返回与其相交的所有对象 与相机的距离。
【讨论】:
以上是关于通过 Swift 设置 ARKit 方向的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 UINavigationController (Swift 2.0 iOS 9) 强制设置横向方向