【问题标题】:SceneKit - adding SCNNode on another SCNNodeSceneKit - 在另一个 SCNNode 上添加 SCNNode
【发布时间】:2018-03-28 10:08:23
【问题描述】:

我试图将球体放在盒子的顶部,但位置很奇怪:球半藏在盒子里。我试图改变盒子和球体枢轴,但没有帮助。代码如下:

    let cubeGeometry = SCNBox(width: 10, height: 10, length: 10, 
    chamferRadius: 0)
    let cubeNode = SCNNode(geometry: cubeGeometry)
    //cubeNode.pivot = SCNMatrix4MakeTranslation(0, 1, 0)
    scene.rootNode.addChildNode(cubeNode)

    let ballGeometry = SCNSphere(radius: 1)
    let ballNode = SCNNode(geometry: ballGeometry)
    ballNode.pivot = SCNMatrix4MakeTranslation(0.5, 0, 0.5)
    ballNode.position = SCNVector3Make(0, 5, 0)
    cubeNode.addChildNode(ballNode)`

结果:

我做错了什么?如何将球放在盒子的顶部?

更新:如果我添加立方体而不是球,它看起来不错

【问题讨论】:

    标签: ios scenekit scnnode scnscene


    【解决方案1】:

    您需要在 Y 轴上平移 cube-height/2 + sphere-radius。因此,您应该:

    ballNode.position = SCNVector3Make(0, 6, 0)
    

    截图如下:

    相关完整代码:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // create a new scene
        let scene = SCNScene()
    
        let cubeGeometry = SCNBox(width: 10, height: 10, length: 10,
                                  chamferRadius: 0)
        cubeGeometry.firstMaterial?.diffuse.contents = UIColor.yellow
        let cubeNode = SCNNode(geometry: cubeGeometry)
        scene.rootNode.addChildNode(cubeNode)
    
        let ballGeometry = SCNSphere(radius: 1)
        ballGeometry.firstMaterial?.diffuse.contents = UIColor.green
        let ballNode = SCNNode(geometry: ballGeometry)
        ballNode.position = SCNVector3Make(0, 6, 0)
        cubeNode.addChildNode(ballNode)
    
        // retrieve the SCNView
        let scnView = self.view as! SCNView
    
        // set the scene to the view
        scnView.scene = scene
    
        // allows the user to manipulate the camera
        scnView.allowsCameraControl = true
    
        // show statistics such as fps and timing information
        scnView.showsStatistics = true
    
        // configure the view
        scnView.backgroundColor = UIColor.gray
    }
    

    更新:为什么是半径而不是半径 / 2

    在 Xcode 的场景编辑器中查看此屏幕截图。立方体的原始位置是(0, 0, 0),球的位置也是;因此球需要移动 r 而不是 r / 2;使用 r / 2 时,高度为 r/2 的球的下部仍将位于立方体内。您可以在编辑器中添加一个立方体和球体,如下图所示,这应该有助于澄清。

    【讨论】:

    • 是的,成功了!谢谢!但为什么我需要添加全半径 (1) 而不是 0.5?我以为球体的锚点在中间?
    • @TimurMustafaev 用为什么 r 而不是 r / 2 更新了答案。
    【解决方案2】:

    一切正常。 您将球节点添加到立方体节点。所以球节点的原点在立方体的中心。 然后将球的位置更改为 y 轴上立方体大小的一半。所以基本上它会弹出,你只看到球的一半(它的半径是 1)。

    所以你必须再次添加一半大小的球来它放在立方体的顶部:

    ballNode.position = SCNVector3Make(0, 5.5, 0)

    【讨论】:

    • 不 :( 看起来有点高,但不在立方体上
    猜你喜欢
    • 2016-01-18
    • 2016-03-25
    • 2017-04-15
    • 2016-12-01
    • 1970-01-01
    • 2014-12-05
    • 2017-01-18
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多