ios - 如何旋转 "func renderer(SCNSceneRenderer, nodeFor: ARAnchor) -> SCNNode?"中的 SCNNode

标签 ios swift xcode scenekit

所以,我能够在 anchor 位置放置一个盒子节点。 现在,如何旋转场景中的 SCNNode?

我试图修改节点的transform和eulerAngles,但它们没有效果:

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    print("nodeFor anchor \(anchor)")

    guard anchor.name == "card" else { return nil }

    let colors = [
        UIColor.yellow, // front
        UIColor.red, // right
        UIColor.blue, // back
        UIColor.green, // left
        UIColor.purple, // top
        UIColor.gray] // bottom

    let sideMaterials = colors.map { color -> SCNMaterial in
        let material = SCNMaterial()
        material.diffuse.contents = color
        material.locksAmbientWithDiffuse = true
        return material
    }

    let boxGeometry = SCNBox(width: 0.12, height: 0.01, length: 0.07, chamferRadius: 0)
    boxGeometry.materials = sideMaterials

    let node = SCNNode(geometry: boxGeometry)
    node.transform = SCNMatrix4MakeRotation(-Float.pi / 2, 1, 0, 0)
    node.eulerAngles.x = .pi / 2

    return node
}

我还尝试在 func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, foranchor: ARAnchor) 中进行旋转

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    node.eulerAngles.x = .pi / 2
}

但这也没有帮助。

我成功地使用下面的代码实现了旋转动画。

    let spin = CABasicAnimation(keyPath: "rotation")
    // Use from-to to explicitly make a full rotation around z
    spin.fromValue = NSValue(scnVector4: SCNVector4(x: 0, y: 0, z: 1, w: 0))
    spin.toValue = NSValue(scnVector4: SCNVector4(x: 0, y: 0, z: 1, w: Float(2 * Double.pi)))
    spin.duration = 3
    spin.repeatCount = 1
    node.addAnimation(spin, forKey: "rotation")

基于这次成功,我也尝试过(但失败了)

    node.rotation = SCNVector4(x: 5, y: 4, z: 3, w: 0)

有人知道如何在 ARSCNViewDelegate 的委托(delegate)方法中旋转我的节点吗?

最佳答案

ARSession将定位和定向您向其出售的节点。最好在子节点上执行轮换到已售出的节点。所以在 func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode?

返回之前,您可以说:

let node = SCNNode(geometry: boxGeometry)
node.eulerAngles = SCNVector3(x: -Float.pi / 2, y: 0, z: 0)

let rootNode = SCNNode()
rootNode.addChildNode(node)
return rootNode

关于ios - 如何旋转 "func renderer(SCNSceneRenderer, nodeFor: ARAnchor) -> SCNNode?"中的 SCNNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51704401/

相关文章:

ios - 推送通知后运行函数

ios - UIImage 转换为数据并返回更改大小?

objective-c - 延迟动画开始后,UIButton 上的触摸事件停止

ios - 核心数据错误

iphone - 创建IBOutlet并用代码连接

ios - 有条件地刷新 tabBarController 中的 View

ios - 检查 CGPathRef 中 CGPoints 数量的最有效方法

objective-c - 如何在具有参数的 Objective-C 中实现快速委托(delegate)方法?

swift - 如何在 Swift 中从字符集中获取随机元素

xcode - 图像.xcassets : error: ERROR: Each TDDistiller instance can be distilled only one time