问题描述
对不起,如果我的问题很愚蠢,我是 SceneKit 的新手。
我使用 SCNnode 球体添加了一个球体,并添加了引脚作为该球体的子节点。
现在,当用户点击任何子节点时,我想将地球旋转到我的子节点将朝向相机中心的角度。
提前致谢
解决方法
如果我的理解正确,点击任何一个孩子,地球就会旋转,使其面向您。我“认为”你可以这样做。
假设您已准确放置子节点并且它们指向远离中心的方向,然后对所有子节点进行观察约束,但将它们设置为空。单击后,在该子节点上设置观察约束并将其指向相机节点。
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)
一旦您将它们放置在地球上并正确旋转,设置观察约束“应该”起作用。它应该看起来有点像针垫(对不起,我只能想到一个例子),然后你的地球应该朝着相机旋转。
希望