首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在"func SCNNode (SCNSceneRenderer,nodeFor: ARAnchor) -> SCNNode?“中旋转渲染器?

如何在"func SCNNode (SCNSceneRenderer,nodeFor: ARAnchor) -> SCNNode?“中旋转渲染器?
EN

Stack Overflow用户
提问于 2018-08-06 17:26:03
回答 1查看 429关注 0票数 2

因此,我能够在锚点位置放置一个长方体节点。现在,如何在场景中旋转SCNNode?

我正在尝试修改节点的transform & eulerAngles,但它们没有任何效果:

代码语言:javascript
复制
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
}

我也试着在函数渲染器中做旋转(_渲染器: SCNSceneRenderer,锚节点: SCNNode,对于锚点: ARAnchor)

代码语言:javascript
复制
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    node.eulerAngles.x = .pi / 2
}

但这也没什么帮助。

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

代码语言:javascript
复制
    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")

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

代码语言:javascript
复制
    node.rotation = SCNVector4(x: 5, y: 4, z: 3, w: 0)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-08 03:39:13

ARSession将定位您提供给它的节点的位置和方向。最好是对子节点执行轮换操作,将其轮换到被维护的子节点。所以在func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode?

在返回之前,你可以说:

代码语言:javascript
复制
let node = SCNNode(geometry: boxGeometry)
node.eulerAngles = SCNVector3(x: -Float.pi / 2, y: 0, z: 0)

let rootNode = SCNNode()
rootNode.addChildNode(node)
return rootNode
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51704401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档