【问题标题】:swift SceneKit calculate node angleswift SceneKit计算节点角度
【发布时间】:2021-08-24 12:42:41
【问题描述】:

我试图将一个节点(引脚)添加到球体节点(在球体节点上录制时),但无法正确计算角度,您能帮帮我吗?

private func addPinToSphere(result: SCNHitTestResult) {
    guard let scene = SCNScene(named: "art.scnassets/tree.scn") else { return }
    guard let treeNode = scene.rootNode.childNode(withName: "Trunk", recursively: true) else { return }
    let x = CGFloat(result.worldCoordinates.x)
    let y = CGFloat(result.worldCoordinates.y)
    treeNode.position = result.worldCoordinates
    treeNode.eulerAngles = SCNVector3((x) * .pi / CGFloat(180), 0, (y - 90) * .pi / CGFloat(180))  // y axis is ignorable
   
    result.node.addChildNode(treeNode)
}

当运行代码时我有这个

但是想要这样

【问题讨论】:

    标签: swift scenekit


    【解决方案1】:

    您可以执行类似于此代码的操作。这是一个导弹发射器,但基本上是一样的。你的 pin = my fireTube,所以创建一个基本节点,然后添加一个带有你的材料的子节点并将其旋转到位。您必须尝试最初将管子放置在哪里,但是一旦将其放置到正确的位置,lookat 约束将始终将其指向正确的方向。

     case .d1, .d2, .d3, .d4, .d5, .d6, .d7, .d8, .d9, .d10:
                let BoxGeometry = SCNBox(width: 0.8, height: 0.8, length: 0.8, chamferRadius: 0.0)
                let vNode = SCNNode(geometry: BoxGeometry)
                BoxGeometry.materials = setDefenseTextures(vGameType: vGameType)
                
                let tubeGeometry = SCNTube(innerRadius: 0.03, outerRadius: 0.05, height: 0.9)
                let fireTube = SCNNode(geometry: tubeGeometry)
                tubeGeometry.firstMaterial?.diffuse.contents  = data.getTextureColor(vTheme: 0, vTextureType: .barrelColor)
                
                fireTube.position = SCNVector3(0, 0.2, -0.3)
                let vRotateX = SCNAction.rotateBy(x: CGFloat(Float(GLKMathDegreesToRadians(-90))), y: 0, z: 0, duration: 0)
                fireTube.runAction(vRotateX)
                vNode.addChildNode(fireTube)
                return vNode
    

    然后在你的基础节点上设置目标,你的子节点将随之旋转:

    func setTarget()
        {
            node.constraints = []
            let vConstraint = SCNLookAtConstraint(target: targetNode)
            vConstraint.isGimbalLockEnabled = true
            node.constraints = [vConstraint]
        }
    

    在您的情况下,目标等于球体的中心质量,只要您正确构建并对齐您的盒子和销钉,销钉将始终指向它。

    【讨论】:

    • 不用担心,很高兴它有帮助。
    猜你喜欢
    • 2021-10-11
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多