1

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

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

结果: 在此处输入图像描述

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

更新:如果我添加立方体而不是球,它看起来就像我想要的那样

4

2 回答 2

3

您需要在 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 的球的下部仍将位于立方体内。您可以在编辑器中添加一个立方体和球体,如下图所示,这应该有助于澄清。

为什么是 r 而不是 r / 2

于 2017-10-17T05:20:16.377 回答
0

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

因此,您必须再次添加一半大小的球才能其放在立方体的顶部:

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

于 2017-10-16T20:10:05.430 回答