μολὼν.λαβέ
μολὼν.λαβέ

Reputation: 668

Strange behavior with SceneKit Node

I created a circular array objects, no problems.

When I rotate there appears to be a sinc or gaussian function at the center.

The camera is a z 60, radius of structure is 30.

Initial view, no artifacts enter image description here

Rotated 90 deg up, no artifacts enter image description here

Rotated 180 deg, artifact appears in center of object enter image description here

Continued rotation, artifact is still there. enter image description here

The code for the object is here

  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

  }
}

Upvotes: 1

Views: 825

Answers (2)

Juguang
Juguang

Reputation: 651

Falling out of Viewing frustum may be the one to cause most problem. However there is another common cause by misunderstanding the behavior of SCNView's allowsCameraControl, that is when you Pinch to zoom in or zoom out (change the camera's fieldOfView), but the pointOfView's position reminds the same.

Your nodes still stand BEHIND the pointOfView, however small the camera's zNear is. Hence you see them got clipped. The code below may help you in this case, at least avoid the problem.

sceneView.pointOfView!.simdPosition 
= float3(0, 0, -scene.rootNode.boundingSphere.radius) 

Upvotes: 0

μολὼν.λαβέ
μολὼν.λαβέ

Reputation: 668

Using these settings

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

the artifacts disappeared. I think this is a problem with zFar, it should have clipped the back surface uniformly not like a lens aberration.

Upvotes: 1

Related Questions