SceneKit - 在另一个 SCNNode 上添加 SCNNode
SceneKit - adding SCNNode on another 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)`
结果:
我做错了什么?如何把球放在禁区的正上方?
更新:如果我添加立方体而不是球,它看起来不错
一切正常运行。
您将球节点添加到立方体节点。所以球节点的原点在立方体的中心。
然后将球的位置更改为 y 轴上立方体大小的一半。所以基本上它弹出,你只看到球的一半(它的半径是 1)。
所以你必须再次将球的一半大小添加到将它放在立方体的顶部:
ballNode.position = SCNVector3Make(0, 5.5, 0)
您需要在 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 的球的下半部分仍将位于立方体内部。您可以像下面的场景一样在编辑器中添加一个立方体和球体,这应该有助于澄清。
我想把球体放在盒子的顶部,但位置很奇怪:球半藏在盒子里。我试图改变盒子和球体的枢轴,但没有帮助。这是代码:
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)`
结果:
我做错了什么?如何把球放在禁区的正上方?
更新:如果我添加立方体而不是球,它看起来不错
一切正常运行。 您将球节点添加到立方体节点。所以球节点的原点在立方体的中心。 然后将球的位置更改为 y 轴上立方体大小的一半。所以基本上它弹出,你只看到球的一半(它的半径是 1)。
所以你必须再次将球的一半大小添加到将它放在立方体的顶部:
ballNode.position = SCNVector3Make(0, 5.5, 0)
您需要在 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 的球的下半部分仍将位于立方体内部。您可以像下面的场景一样在编辑器中添加一个立方体和球体,这应该有助于澄清。