SceneKit - добавление SCNNode на другой SCNNode

Я пытаюсь поставить сферу сверху коробки, но позиция странная: мяч наполовину спрятан внутри коробки. Я попытался сменить шарнир коробки и сферы, но это не помогло. Вот код:

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

и результат:

что я делаю не так? Как правильно поставить мяч на верхнюю часть коробки?

ОБНОВЛЕНИЕ: если я добавлю Cube вместо ball, он выглядит хорошо, как я хочу

2 ответа

Решение

Вам нужно перевести по оси 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 будет все еще внутри куба. Вы можете просто добавить куб и сферу, как в сцене ниже в редакторе, и это должно прояснить ситуацию.

Почему г, а не г / 2

Все работает нормально. Вы добавили узел шара в узел куба. Таким образом, начало узла шара находится в центре куба. Затем вы меняете положение шара на половину размера куба по оси Y. Таким образом, в основном это всплывает, и вы видите только половину шара (его радиус равен 1).

Таким образом, вы должны снова добавить половину размера шара, чтобы поместить его только на вершину куба:

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

Другие вопросы по тегам