我试图使我的AR体验更加友好的用户。
我有一个SCNnode (objectNodeToPlace),每当摄像机检测到imageReference时,我都希望放置在渲染器创建/更新的节点上:
class ViewController: UIViewController, ARSCNViewDelegate {
var objectNodeToPlace: SCNNode
...
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
placeObject(object: objectNodeToPlace, at: node, ...)
}
}
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
placeObject(object: objectNodeToPlace, at: node, ...)
}
}我的placeObject函数非常简单,我只是改变了“objectNodeToPlace”的方向:
private func placeObject(object objectNodeToPlace: SCNNode, at node: SCNNode, ...) {
...
node.addChildNode(objectNodeToPlace)
}一切正常,我的对象总是放在最新检测到的imageReference上。
但是当我的对象被放置到一个图像上并且检测到一个新的图像时,对象跳到最新的上,它不是很棒,非常紧张/不稳定。
我的目标是使这一过渡更加顺利。
我现在拥有的
下面是它现在看起来的严肃性:
红色的,imageReference。
我想要的
以下是我想要的:
我所发现的
我已经找到了这个包,SceneKit Bezier动画,动画之间的运动2分,但我看起来有点过分,因为我想要。
我还读过这个主题,SceneKit旋转和动画一个SCNNode,一个响应建议使用CABasicAnimation,另一个建议使用SCNAction。
我觉得SCNAction是快速的最好的方式,而不是我想要的那种精确的动画,我不知道我在做什么,所以我很高兴听到更有经验的开发人员的意见。
编辑
我在苹果文档动画SceneKit内容上找到了我正在寻找的东西--它被称为隐式动画,它应该只使用一行代码来确定我的更改的动画持续时间:
SCNTransaction.animationDuration = 1.0在更改place()函数中节点的欧拉角(谁是“可动的”)之前,我尝试了这一行:
SCNTransaction.animationDuration = 1.0
objectNodeToPlace.eulerAngles.x = radian但那不起作用。我很确定我只是错过了一件简单的事情,但我在网上找不到例子,甚至在SCNTransaction的文档中也是如此。
有人有主意吗?
发布于 2022-05-17 06:07:42
阿克塞尔
SCNTransaction至少需要三条语句。
SCNTransaction.start()
SCNTransaction.animationDuration = 1.0
//commands
SCNTransaction.commit()我最近在SceneKit上写了十几篇文章,你可以找到这里。
https://stackoverflow.com/questions/72132059
复制相似问题