- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试使用新的 ARKit 来替换我拥有的另一个类似的解决方案。真是太棒了!但我似乎无法弄清楚如何以编程方式移动 ARAnchor。我想慢慢地将 anchor 移动到用户的左侧。
在用户前方 2 米处创建 anchor :
var translation = matrix_identity_float4x4
translation.columns.3.z = -2.0
let transform = simd_mul(currentFrame.camera.transform, translation)
let anchor = ARAnchor(transform: transform)
sceneView.session.add(anchor: anchor)
anchor.transform.columns.3.x = anchor.transform.columns.3.x + 0.1
最佳答案
您不需要移动 anchor 。 (挥手)那不是你要找的API...
添加 ARAnchor
session 的对象实际上是关于在现实世界空间中“标记”一个点,以便您以后可以引用它。点(1,1,1)
(例如)始终是点 (1,1,1)
— 你不能把它移到别的地方,因为那不是重点 (1,1,1)
了。
做一个 2D 类比: anchor 是引用点,有点像 View 的边界。系统(或您的另一段代码)告诉 View 它的边界在哪里,并且 View 相对于这些边界绘制其内容。 AR 中的 anchor 为您提供了可用于绘制 3D 内容的引用点。
您要问的实际上是关于在两点之间移动(和动画移动)虚拟内容。而且 ARKit 本身真的不是关于显示或动画虚拟内容——那里有很多很棒的图形引擎,所以 ARKit 不需要重新发明那个轮子。 ARKit 所做的是提供一个真实世界的引用框架,让您使用现有的图形技术(如 SceneKit 或 SpriteKit(或 Unity 或 Unreal,或使用 Metal 或 GL 构建的自定义引擎)来显示或动画内容。
既然你提到尝试用 SpriteKit 做到这一点......当心,它会变得一团糟。 SpriteKit 是一个 2D 引擎,而 ARSKView
提供了一些在那里硬塞第三维的方法,这些方法有其局限性。ARSKView
自动更新 xScale
, yScale
, 和 zRotation
与 ARAnchor
相关联的每个 Sprite ,提供3D透视的错觉。但这仅适用于连接到 anchor 的节点,并且如上所述, anchor 是静态的。
但是,您可以向场景中添加其他节点,并使用这些相同的属性使这些节点与 ARSKView
匹配。 - 管理节点。下面是一些您可以在 ARKit/SpriteKit Xcode 模板项目中添加/替换的代码来做到这一点。我们将从一些基本逻辑开始,在第三次点击时运行弹跳动画(在使用前两次点击放置 anchor 之后)。
var anchors: [ARAnchor] = []
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Start bouncing on touch after placing 2 anchors (don't allow more)
if anchors.count > 1 {
startBouncing(time: 1)
return
}
// Create anchor using the camera's current position
guard let sceneView = self.view as? ARSKView else { return }
if let currentFrame = sceneView.session.currentFrame {
// Create a transform with a translation of 30 cm in front of the camera
var translation = matrix_identity_float4x4
translation.columns.3.z = -0.3
let transform = simd_mul(currentFrame.camera.transform, translation)
// Add a new anchor to the session
let anchor = ARAnchor(transform: transform)
sceneView.session.add(anchor: anchor)
anchors.append(anchor)
}
}
var ballNode: SKLabelNode = {
let labelNode = SKLabelNode(text: "🏀")
labelNode.horizontalAlignmentMode = .center
labelNode.verticalAlignmentMode = .center
return labelNode
}()
func startBouncing(time: TimeInterval) {
guard
let sceneView = self.view as? ARSKView,
let first = anchors.first, let start = sceneView.node(for: first),
let last = anchors.last, let end = sceneView.node(for: last)
else { return }
if ballNode.parent == nil {
addChild(ballNode)
}
ballNode.setScale(start.xScale)
ballNode.zRotation = start.zRotation
ballNode.position = start.position
let scale = SKAction.scale(to: end.xScale, duration: time)
let rotate = SKAction.rotate(toAngle: end.zRotation, duration: time)
let move = SKAction.move(to: end.position, duration: time)
let scaleBack = SKAction.scale(to: start.xScale, duration: time)
let rotateBack = SKAction.rotate(toAngle: start.zRotation, duration: time)
let moveBack = SKAction.move(to: start.position, duration: time)
let action = SKAction.repeatForever(.sequence([
.group([scale, rotate, move]),
.group([scaleBack, rotateBack, moveBack])
]))
ballNode.removeAllActions()
ballNode.run(action)
}
SKAction
,我们无法在制作动画时调整动画的开始/结束状态,因此球会不断在其原始(屏幕空间)位置/旋转/缩放之间来回弹跳。
view(_:didUpdate:for:)
委托(delegate)回调)上:
didUpdate
执行两次此操作回调,因为每个节点都会得到一个回调。 touchesBegan
函数从上面进入
ViewController
. (也将
as ARSKView
转换为
as ARSCNView
。)
// in global scope
func makeBillboardNode(image: UIImage) -> SCNNode {
let plane = SCNPlane(width: 0.1, height: 0.1)
plane.firstMaterial!.diffuse.contents = image
let node = SCNNode(geometry: plane)
node.constraints = [SCNBillboardConstraint()]
return node
}
// inside ViewController
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
// emoji to image based on https://stackoverflow.com/a/41021662/957768
let billboard = makeBillboardNode(image: "⛹️".image())
node.addChildNode(billboard)
}
let ballNode = makeBillboardNode(image: "🏀".image())
func startBouncing(time: TimeInterval) {
guard
let sceneView = self.view as? ARSCNView,
let first = anchors.first, let start = sceneView.node(for: first),
let last = anchors.last, let end = sceneView.node(for: last)
else { return }
if ballNode.parent == nil {
sceneView.scene.rootNode.addChildNode(ballNode)
}
let animation = CABasicAnimation(keyPath: #keyPath(SCNNode.transform))
animation.fromValue = start.transform
animation.toValue = end.transform
animation.duration = time
animation.autoreverses = true
animation.repeatCount = .infinity
ballNode.removeAllAnimations()
ballNode.addAnimation(animation, forKey: nil)
}
关于swift - 如何以编程方式移动 ARAnchor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44401173/
我正在尝试使用新的 ARKit 来替换我拥有的另一个类似的解决方案。真是太棒了!但我似乎无法弄清楚如何以编程方式移动 ARAnchor。我想慢慢地将 anchor 移动到用户的左侧。 在用户前方 2
我正在试验 SpriteKit 和 ARKit,想知道如何计算同一场景中两个 ARAnchor 之间的角度。 这意味着获取 anchor 在世界上的位置并计算它们定义的线与水平面(或另一个任意平面)的
我有一个应用程序使用 ARImageAnchor 来通过相机检测图像。我注意到,虽然场景节点在 3D 空间中的位置会实时更新,但节点的方向(xyz 旋转)可能需要几秒钟才能更新。任何附加的场景节点在更
在将 SCNNode 添加到 ARSCNView 的场景后,我试图获取 anchor 。我的理解是应该自动创建 anchor ,但我似乎无法检索它。 下面是我添加它的方法。该节点保存在一个名为 tes
我在使用 ARSKView 的 ARkit 项目中遇到了障碍。 我想在屏幕上使用点击并创建 ARAnchor 时实现,多个 SKNodes 将从同一个 anchor 弹出。由于我需要单独与每个节点交互
你好,我是使用 ARKit 进行开发的新手,所以这可能是一个基本问题,但我可以将 ARAnchor 附加到移动的物体上,比如打印出来的条形码吗? 我正在尝试开发一个应用程序,其中不同的对象应该显示在不
我目前正在开发 ARKit 2.0 应用程序,用户需要在映射空间周围找到虚拟对象,我使用了 AR Persistence 并且我意识到在初始 ARWorldMap 重新定位后,所有对象都会立即出现,即
When application launched first a vertical surface is detected on one wall than camera focus to the
我正在使用 XCode 9 上的 AR 入门应用,其中 anchor 是在点击场景中创建的: override func touchesBegan(_ touches: Set, with event
我目前正在用 RealityKit 做一些实验。 我一直在查看一些示例代码,我对 ARAnchor 和 AnchorEntity 之间的区别以及何时使用其中一个感到有点困惑. 到目前为止我知道: 两者
在 ARKit 中,我们可以通过 .showFeaturePoints 类型属性可视化在 ARSession 中检测到的 Feature Points' Cloud: self.sceneView.d
这几天我一直在努力解决这个问题。 给定一个基于 ARKit 的应用程序,我可以在其中跟踪用户的面部,我如何才能从它的 anchor 获得面部的绝对旋转? 我可以获得 ARAnchor 的变换,它是一个
如何使 ARNode 指向 ARAnchor? 我想使用 art.scnassets/ship.scn 显示在屏幕中央并指向我刚刚放置在场景中某处的对象。 /// ViewController Cla
问题: 如何创建一个与 ARObjectAnchor.referenceObject 具有相同高度和宽度的新 SKSpriteNode。 上下文: 我目前正在摆弄 ARKit 的新对象检测功能,并且有
我正在使用 WWDC 2018 中推出的 ARKit 2.0 测试 Apple 的多用户 AR 演示应用程序:Creating a multiuser AR experience . 文档说,在每个设
我正在尝试将 ARAnchor 投影到 2D 空间,但我面临方向问题... 在我将左上角、右上角、左下角、右下角位置投影到二维空间的函数下面: /// Returns the projection o
我在我的项目中使用 ARAnchor,我想从这个 anchor 获取位置 (3D)。 代码: sceneView.session.currentFrame?.anchors.first?.transf
我正在使用ARSessionDelegate在 ARView我在其中初始化 ARBodyTrackingConfiguration . session方法 didAdd: [ARAnchor]和 di
我有下一个代码: guard let feauturePoint = frame.hitTest(normalizedPoint, types: .featurePoint).first?.w
我需要将多个不同的 ARWorldMap 实例组合在一起。换句话说,我需要使用 ARWorldMap 的两个(或更多)实例的组合 anchor 创建一个实例。 我可以在整个应用程序中共享同一个实例,但
我是一名优秀的程序员,十分优秀!