2017-10-16 16 views
0

Je tente de placer une sphère sur le dessus de la boîte, mais la position est étrange: la balle est à moitié cachée dans la boîte. J'ai essayé de changer de pivot de boîte et de sphère, mais cela n'a pas aidé. Voici le code:SceneKit - ajout de SCNNode sur un autre 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)` 

et le résultat: enter image description here

ce que je fais mal? Comment mettre la balle sur le côté supérieur de la boîte?

MISE À JOUR: Si j'ajoute Cube au lieu de la balle, il semble bien que je veux

Répondre

1

Vous devez traduire sur l'axe Y par cube-height/2 + sphere-radius. Ainsi, vous devez avoir:

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

Voici la capture d'écran:

Ball on top of the cube

Le code complet applicable:

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 
} 

Mise à jour: Pourquoi rayon et non rayon/2

Voir ce scr eenshot de l'éditeur de scène de Xcode. La position originale du cube est (0, 0, 0) et il en est de même de la balle; par conséquent, la balle doit être déplacée par r et non par r/2; avec r/2, la partie inférieure de la boule avec la hauteur r/2 sera toujours à l'intérieur du cube. Vous pouvez simplement ajouter un cube et une sphère comme dans la scène ci-dessous dans l'éditeur et cela devrait aider à clarifier.

Why r and not r/2

+0

Ouais, ça a fonctionné! Merci! Mais pourquoi je dois ajouter un rayon complet (1) au lieu de 0,5? Je pensais que l'ancre point de la sphère est au milieu? –

+1

@TimurMustafaev Mis à jour la réponse avec pourquoi r et non r/2. –

0

Tout fonctionne normalement. Vous avez ajouté le noeud boule au noeud cube. Donc, l'origine du noeud boule est au centre du cube. Ensuite, vous changez la position de la boule à la moitié de la taille du cube sur l'axe des y. Donc, fondamentalement, il apparaît et vous voyez seulement la moitié de la balle (son rayon est 1).

Vous devez ajouter encore la moitié de la taille de la balle pour mettre juste sur le dessus du cube:

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

+0

Non :(Il semble un peu plus haut, mais pas sur le cube –