如果用户点击任何将指向相机的子节点,则旋转 SCNNode

问题描述

对不起,如果我的问题很愚蠢,我是 SceneKit 的新手。 我使用 SCNnode 球体添加一个球体,并添加了引脚作为该球体的子节点。 现在,当用户点击任何子节点时,我想将地球旋转到我的子节点将朝向相机中心的角度。 提前致谢

enter image description here

解决方法

如果我的理解正确,点击任何一个孩子,地球就会旋转,使其面向您。我“认为”你可以这样做。

假设您已准确放置子节点并且它们指向远离中心的方向,然后对所有子节点进行观察约束,但将它们设置为空。单击后,在该子节点上设置观察约束并将其指向相机节点。

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

更困难的部分可能是确保您的子节点实际上远离中心,因为这很重要。 IE: 用铅笔戳一个球并在你手中旋转它。铅笔的尖端很重要,因为它完全按照您最初放置它的方式粘在您的父对象上。例如,如果它面向地球的中心点,那么您会得到相反的效果。

测试它的一种方法是使用指针创建子节点 - 在这种情况下,它只是我的一个游戏中的一个炮塔。

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)

一旦您将它们放置在地球上并正确旋转,设置观察约束“应该”起作用。它应该看起来有点像针垫(对不起,我只能想到一个例子),然后你的地球应该朝着相机旋转。

希望