Как добавить 3D-модели в сцену, чтобы они имели определенную позицию XYZ?
Однажды я написал функцию, в которой добавил геометрические конусы на сцену. Это выглядело так:
func addZombies(i:Int, x: Float, y: Float, z: Float)
{
let node = SCNNode()
node.geometry = SCNCone(topRadius: 0.0, bottomRadius: 1, height: 2)
node.position = SCNVector3(x, y, z)
sceneView.scene.rootNode.addChildNode(node)
nodes.append(node)
}
где узлы - это массив, хранящий SCNNodes. Все работало нормально Если бы я переехал, у шишек было бы то же положение, что и у них, настоящая "реальность".
Тем не менее, я купил хорошую 3D-модель зомби, и я попытался изменить конусы на модели. Я нашел какое-то решение и попытался реализовать его сам. Вот что я придумал:
func addZombies(i:Int, x: Float, y: Float, z: Float)
{
guard let zombieScene = SCNScene(named: "art.scnassets/StrongZombie.DAE") else { return }
let zombieNode = SCNNode()
let zombieSceneChildNodes = zombieScene.rootNode.childNodes
for childNode in zombieSceneChildNodes
{
zombieNode.addChildNode(childNode)
}
zombieNode.position = SCNVector3(x, y, z)
zombieNode.scale = SCNVector3(0.5, 0.5, 0.5)
//zombieNode.look(at: (sceneView.pointOfView?.position)!)
sceneView.scene.rootNode.addChildNode(zombieNode)
nodes.append(zombieNode)
}
К сожалению, несмотря на то, что это создает зомби на определенных позициях, если я двигаюсь, зомби "двигаются" со мной. Они отображаются по отношению к движущейся камере, что для меня нежелательно. Может кто-нибудь мне помочь? Я хочу их как шишки. Спасибо заранее
2 ответа
Только увидев ограниченный фрагмент кода....
Я думаю, что это может иметь какое-то отношение к PhysicShape по умолчанию, который аппроксимируется исходным файлом DAE. Форма иногда может быть слишком сложной и вызывать проблемы с отслеживанием.
Попробуйте установить zombieNode PhysicBody в стандартную форму коробки
let box = SCNBox(width:0.01, height: 0.01, length: 0.05, chamferRadius: 0.001)
zombieNode.physicsBody = SCNPhysicsBody(type: .dynamic, shape: SCNPhysicsShape(geometry:box))
Также установите debugOptions для отображения фигур физики, если вы еще этого не сделали. Это также поможет с отладкой желаемых конфликтов.
sceneView.debugOptions = .showPhysicsShapes
Вместо загрузки файла dae и циклического обхода дочерних узлов каждый раз, когда вы добавляете зомби, сохраняйте узел зомби ранее в свойстве / переменной, например в viewdidload. Затем каждый раз, когда вы добавляете зомби, используйте свойство.clone этого узла зомби и вместо этого добавляйте его в дочерние узлы корневого узла.
Если в файле dae есть только один объект, вам не нужно перебирать его дочерние узлы, просто используйте childnodes.firstObject.