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 будет все еще внутри куба. Вы можете просто добавить куб и сферу, как в сцене ниже в редакторе, и это должно прояснить ситуацию.
Все работает нормально. Вы добавили узел шара в узел куба. Таким образом, начало узла шара находится в центре куба. Затем вы меняете положение шара на половину размера куба по оси Y. Таким образом, в основном это всплывает, и вы видите только половину шара (его радиус равен 1).
Таким образом, вы должны снова добавить половину размера шара, чтобы поместить его только на вершину куба:
ballNode.position = SCNVector3Make(0, 5.5, 0)