swift SceneKit计算节点角度

swift SceneKit calculate node angle

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

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)
}

当 运行 代码我有这个

但是想要这样

您可以按照与此代码类似的方式进行操作。这是一个导弹发射器,但基本上是一回事。你的 pin = 我的 fireTube,所以创建一个基础节点,然后添加一个包含你的材料的子节点并将其旋转到位。您将不得不尝试最初放置管子的位置,但是一旦您将它放到正确的位置,观察约束将始终将其指向正确的方向。

 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]
    }

在您的情况下,目标等于球体的中心质量,并且定位点将始终指向它,前提是您正确构建并对齐了盒子和定位点。