Как обеспечить, чтобы камера SceneKit всегда указывала на определенную позицию - PullRequest
0 голосов
/ 04 июня 2019

Я пишу игру в Swift 5 (но у меня была та же проблема со Swift 4, которую я недавно обновил игрой), со всем моим SCNNode, сосредоточенным вокруг SCNVector3Zero. Другими словами (0,0,0) находится в центре моей игровой площадки.

SCNCamera присоединен к SNCNode и расположен за пределами игровой зоны, глядя на (0,0,0).

cameraNode.look(at: SCNVector3Zero)

Если я размещу 5 узлов в сцене, все на плоскости y = 0, (0,0,0), (-1,0, -1), (1,0,1), (-1, 0,1) и (1,0, -1), как лицо кости, показывающей пять, все это прекрасно работает. Я могу вращаться вокруг сцены с узлом в (0,0,0), оставаясь в центре без движения.

Если я добавлю 2-ую строку, то первая строка переместится на y = 1, а вторая строка получит узлы с y = -1, сцена немного покачивается при вращении.

Чем дальше узел перемещается из центра, тем более преувеличенным становится это колебание.

Вот код, устанавливающий сцену (этот пример имеет три строки и выглядит как трехмерная «пяти» грань игральных костей, точка в центре (0,0,0) и другие точки в каждом углу куб) ...

        addSphere(
            x: 0.0,
            y: 0.0,
            z: 0.0,
            radius: radius,
            textureName: "earth")

        addSphere(
            x: -2.0 * spacing,
            y: -2.0 * spacing,
            z: 0.0,
            radius: radius,
            textureName: "earth")
        addSphere(
            x: 2.0 * spacing,
            y: 2.0 * spacing,
            z: 0.0,
            radius: radius,
            textureName: "earth")


        addSphere(
            x: -2.0 * spacing,
            y: 2.0 * spacing,
            z: 0.0,
            radius: radius,
            textureName: "granite")
        addSphere(
            x: 2.0 * spacing,
            y: -2.0 * spacing,
            z: 0.0,
            radius: radius,
            textureName: "granite")


        addSphere(
            x: 0.0,
            y: -2.0 * spacing,
            z: -2.0 * spacing,
            radius: radius,
            textureName: "slime")
        addSphere(
            x: 0.0,
            y: 2.0 * spacing,
            z: 2.0 * spacing,
            radius: radius,
            textureName: "slime")


        addSphere(
            x: 0.0,
            y: 2.0 * spacing,
            z: -2.0 * spacing,
            radius: radius,
            textureName: "wood")
        addSphere(
            x: 0.0,
            y: -2.0 * spacing,
            z: 2.0 * spacing,
            radius: radius,
            textureName: "wood")

Этот код ведет себя, все симметрично вокруг (0,0,0) с узлом в (0,0,0), оставаясь именно там, где и должен.

Если я добавлю этот узел в сцену, все пойдет не так ...

        addSphere(
            x: 6.0,
            y: 6.0,
            z: 6.0,
            radius: radius,
            textureName: "earth")

Я пытался добавить фиксированное физическое тело к каждому узлу с нулевой массой, но безрезультатно. Это похоже на то, что камера больше не смотрит прямо на (0,0,0), но на нее влияют только узлы сцены.

Я пробовал все виды перестановок добавления узлов, и в некоторых тестах кажется, что добавление чего-либо со значением для оси z вызывало проблемы

Это метод addSphere ...

    internal func addSphere(x: Float, y: Float, z: Float, radius: Float, color: UIColor, textureName: String) -> SCNNode {

        let sphereGeometry = SCNSphere(radius: CGFloat(radius))
        sphereGeometry.firstMaterial?.diffuse.contents = UIImage(imageLiteralResourceName: textureName)

        let sphereNode = SCNNode(geometry: sphereGeometry)
        sphereNode.name = "dot"

        sphereNode.position = SCNVector3(x: x, y: y, z: z)
        sphereNode.lines = [];
        sphereNode.ignoreTaps = false
        sphereNode.categoryBitMask = NodeBitMasks.dot

        //sphereNode.physicsBody = SCNPhysicsBody(type: .static, shape: nil)

        self.rootNode.addChildNode(sphereNode)

        return sphereNode
    }

Ошибок нет, и, как и следовало ожидать, любая точка, расположенная в точке (0,0,0), должна оставаться статичной при вращении вокруг, глядя на эту точку.

Любые указатели были бы очень благодарны, так как я не могу понять, почему он так себя ведет.

...