Как добавить 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.

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