- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
ARKit
很新,我在 swift 方面也很新……所以我遇到了一些麻烦……
我想保存在 session 期间检测到的 ARPlaneAnchor
并在我重新启动我的应用程序时重新加载它们。我的手机总是在同一个地方,我想扫描房间一次。每次启动应用程序时,都会想起我在房间里找到的 Anchor。
我尝试了几种解决方案:
解决方案1:使用以下方法保存 ARPlaneAnchor:NSKeyedArchiver.archiveRootObject(plane, toFile: filePath)
我遇到了这个错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ARPlaneAnchor encodeWithCoder:]: unrecognized selector sent to instance
我想也许我不能在本地保存这种数据
解决方案 2: 存储 ARPlaneAnchor
的数据,然后在我启动应用程序时实例化它们。数据主要是 float 的。我可以轻松创建 ARAnchor
,我可以将它们转换为 ARPlaneAnchor
,但我无法修改 ARPlaneAnchor
的“center”和“extend”参数> 因为他们只有 getter 而没有 setter。所以我无法创建好的 anchor 。
我愿意接受任何解决方案。我想我需要存储 ARAnchor 对象,但现在我找不到不崩溃的方法!因此,如果有人可以帮助我,我将不胜感激。
最佳答案
首先...如果您的应用仅限于设备永久安装并且用户永远无法移动或旋转设备的情况,那么使用 ARKit 在相机画面上显示叠加内容有点像“用大炮”之类的情况。您也可以在开发时确定您的 3D 引擎需要什么样的相机投影,使用“哑”相机供稿,并在顶部运行您的 3D 引擎,而不需要 iOS 11 或支持 ARKit 的设备。
因此,在您致力于具体的解决方案和解决方法之前,您可能需要更多地考虑您的用例或技术堆栈。
至于你更具体的问题...
ARPlaneAnchor
完全是一个只读类,因为它的用例完全是只读的。它存在的唯一目的是为 ARKit 提供一种方法来为您提供有关检测到的平面的信息。但是,一旦您获得了这些信息,您就可以随心所欲地使用它。从那时起,您不再需要在等式中保留 ARPlaneAnchor
。
也许您对平面检测(和基于 SceneKit 的显示)的典型用例感到困惑:
renderer(_:didAdd:for:)
接收 ARPlaneAnchor
对象ARSCNView
自动为您定位该内容,使其跟随飞机的位置但是,如果您的飞机相对于相机的位置是静止的,则您不需要所有这些。
如果放置需要持续管理,您只需要 ARKit 来处理场景中的内容放置,就像实时平面检测的情况一样(ARKit 改进了它对平面位置和范围的估计并相应地更新 anchor )。如果您提前完成了所有飞机查找工作,您将不会收到更新,因此您不需要 ARKit 来管理更新。
相反,您的步骤可以看起来更像这样:
换句话说,您的“解决方案 2”是朝着正确方向迈出的一步,但还不够。您想要归档的不是 ARPlaneAnchor
实例本身,而是它包含的信息 — 然后在取消归档时,您不需要重新创建 ARPlaneAnchor
实例,您只需需要使用该信息。
因此,如果您使用“实时”平面检测来放置内容:
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let planeAnchor = anchor as? ARPlaneAnchor else { return }
let extent = planeAnchor.extent
let center = planeAnchor.center
// planeAnchor.transform not used, because ARSCNView automatically applies it
// to the container node, and we make a child of the container node
let plane = SCNPlane(width: CGFloat(extent.x), height: CGFloat(extent.z))
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = .pi / 2
planeNode.simdPosition = center
node.addChildNode(planeNode)
}
然后你可以为静态内容放置做这样的事情:
struct PlaneInfo { // something to save and restore ARPlaneAnchor data
let transform: float4x4
let center: float3
let extent: float3
}
func makePlane(from planeInfo: PlaneInfo) { // call this when you place content
let extent = planeInfo.extent
let center = float4(planeInfo.center, 1) * planeInfo.transform
// we're positioning content in world space, so center is now
// an offset relative to transform
let plane = SCNPlane(width: CGFloat(extent.x), height: CGFloat(extent.z))
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = .pi / 2
planeNode.simdPosition = center.xyz
view.scene.rootNode.addChildNode(planeNode)
}
// convenience vector-width conversions used above
extension float4 {
init(_ xyz: float3, _ w: Float) {
self.init(xyz.x, xyz.y, xyz.z, 1)
}
var xyz: float3 {
return float3(self.x, self.y, self.z)
}
}
关于ios - swift : ARKit Save ARPlaneAnchor for next session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45306688/
我正在尝试绘制一个可以帮助某人了解元素尺寸的盒子,但我一直遇到一个问题,因为当我将物理元素放在飞机顶部时,我首先需要识别飞机,所以我的盒子被画了进去项目的前面。 是否有可能以某种方式克服这一点? 最佳
我正在用 swift 4 制作一个简单的标尺 ARKit 应用。 但我遇到的问题是,有时我的措施有一点偏差或完全偏差。我认为,这可能是因为 ARkit 校准不当,没有正确检测到我的表面。 我目前在 3
我一直在用 ARKit 构建一个门户,虽然构建一个虚拟环境很容易创建和移动,但我想让我进入一个重复播放 360 度视频的环境。我认为可以通过将 360 度视频作为纹理包装到球体来完成,但 ARKit
我正在尝试向场景中的每个节点添加动画。我的一个问题是,在层次结构中 - 我应该将动画添加到哪个节点。我认为它是由您实际看到的内容所代表的节点,这将是网格对象...但我有一个持有两个灯和网格对象的节点.
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 2 年前。 Improve t
我正在使用 ARKit 进行 AR 项目。 我想添加一个 UIView 到 ARKit 场景。当我点击一个对象时,我想获取该对象旁边的“弹出窗口”信息。此信息位于 UIView 中。 是否可以将此 U
我想使用 Vuforia 检测标记并在其上放置一个 3d 对象。从那时起,我想在我的应用程序中使用 ARKit。我如何知道检测到的标记或 3d 对象的 ARKit 世界变换? 我正在使用相同的 Vie
我上下阅读了所有 ARKit 类的完整文档。我没有看到任何描述实际获取用户面部纹理的能力的地方。 ARFaceAnchor 包含 ARFaceGeometry(由顶点组成的拓扑和几何)和 BlendS
我正在使用 ARKit 2 和 ARWorldMapData 我创建了一个 AR 世界,它可以使用来自 link here 的 map 数据等识别您的周围环境.现在我正在尝试弄清楚如何获取所有特征点并
我正在使用 ARKit 将虚拟对象放置在真实环境中。它在 Xcode 9 和 iOS 11 中运行良好。但是当我更新 Xcode 和 iOS 时,如果我将虚拟对象放在检测到的平面上,它就会卡住,如果我
我收到关于 init() 的错误消息不适用于 ARLightEstimate . 代码: class LightSensorManager { let lightEstimate = ARLi
我需要使用 ARKit 检测虚拟对象何时与现实世界对象接触。 有什么办法可以查出来吗? 最佳答案 首先您需要创建一个符合OptionSet 协议(protocol)并具有bitset 类型属性的碰撞类
我想实现类似的东西 ARCore's raycast method它采用世界空间坐标中的任意光线而不是屏幕空间点: List hitTest (float[] origin3, int originO
嗨,我正在尝试在节点周围产生发光效果。我使用了 SCNNode 过滤器属性并设置为 CIFilter 数组。 仅当节点后面没有我不理解的节点时,它才起作用并呈现。我尝试设置渲染顺序和 readDept
我正在尝试重现 ARCamera 的项目点函数,但由于某种原因,这些值没有正确匹配。我正在使用 ARCamera 的投影矩阵和 View 矩阵并应用基本的 CG 透视变换数学,(PV) * p,但 N
我想获得所有三个轴的旋转度数。我正在尝试用横向模式来实现。当从左向右旋转设备(Y 旋转)时,我希望一旦用户设置左端并向右旋转即可覆盖度数。所以当它到达起点时我们需要 360 度。所以对于y轴旋转,使用
我正在使用新的 ARKit,并且能够创建一个名为 SphereNode 的新文件,该文件能够在 View 上创建可放置的 Sphere。 重点是我真的想添加一个自定义对象而不是标准球体。一些建议?这是
我一直在使用 ARkit 并且很喜欢它,但我注意到在负载跟踪期间可能会有点跳动(突然物体从它们的位置跳出一点点,比如 1-3 厘米)。我一直在想是否有一种方法可以平滑这些跳跃,这样就不会那么分散注意力
我正在尝试从以下内容中检索 string=Gate。 | geometryIndex=0 node= | no child> bone=(null)> MyCode 访问几何并且工作正常,如下 l
我正在尝试使用 ARKit 构建家具放置 AR 应用程序,我的项目中有 .scn 椅子及其 PNG 纹理,我的应用程序应该检测水平面,然后当用户点击时,将对象放置在点击的位置。 但是当我点击时,该对象
我是一名优秀的程序员,十分优秀!