Странное поведение с узлом SceneKit

Я создал круговой массив объектов, без проблем.

Когда я поворачиваюсь, в центре появляется функция синуса или гаусса.

Камера a z 60, радиус структуры 30.

Первоначальный вид, без артефактов

Повернут на 90 градусов вверх, нет артефактов

Поворот на 180 градусов, в центре объекта появляется артефакт

Продолжение вращения, артефакт все еще там.

Код для объекта здесь

  class func Build(scene: SCNScene) -> SCNNode {

    let radius: Double = 30.0
    let numberOfStrands: Int = 24

    //Create the base chromosomes.
    let baseChromosome = SCNBox(width: 4.0, height: 24, length: 1.0, chamferRadius: 0.5)
    let baseChromosomes = DNA.buildCircleOfObjects(baseChromosome, numberOfItems: numberOfStrands, radius: radius)
    baseChromosomes.position = SCNVector3(x: 0, y: 0.5, z: 0)
    return baseChromosomes

  }

  class func buildCircleOfObjects(_geometry: SCNGeometry, numberOfItems: Int, radius: Double) -> SCNNode {

    var x: Double = 0.0
    var z: Double = radius
    let theta: Double = (M_PI) / Double(numberOfItems / 2)
    let incrementalY: Double = (M_PI) / Double(numberOfItems) * 2

    let nodeCollection = SCNNode()
    nodeCollection.position = SCNVector3(x: 0, y: 0.5, z: 0)

    for index in 1...numberOfItems {

      x = radius * sin(Double(index) * theta)
      z = radius * cos(Double(index) * theta)

      let node = SCNNode(geometry: _geometry)
      node.position = SCNVector3(x: Float(x), y: 0, z:Float(z))

      let rotation = Float(incrementalY) * Float(index)
      node.rotation = SCNVector4(x: 0, y: 1, z: 0, w: rotation)
      nodeCollection.addChildNode(node)

    }

    return nodeCollection

  }
}

2 ответа

Решение

Используя эти настройки

cameraNode.camera?.xFov = 60
cameraNode.camera?.yFov  = 60
cameraNode.camera?.zFar = 1000
cameraNode.camera?.zNear = 0.01

артефакты исчезли. Я думаю, что это проблема с zFar, он должен был равномерно обрезать заднюю поверхность, а не аберрацию линзы.

Падение из-за просмотра усеченного конуса может стать причиной большинства проблем. Однако есть еще одна распространенная причина, связанная с неправильным пониманием поведения allowCameraControl в SCNView, то есть когда вы увеличиваете или уменьшаете масштаб (изменяете fieldOfView камеры), но положение pointOfView напоминает то же самое.

Ваши узлы по-прежнему стоят позади PointOfView, каким бы маленьким не был zNear камеры. Следовательно, вы видите, что их обрезали. Код ниже может помочь вам в этом случае, по крайней мере, избежать проблемы.

sceneView.pointOfView!.simdPosition 
= float3(0, 0, -scene.rootNode.boundingSphere.radius) 
Другие вопросы по тегам