SceneKit节点的奇怪行为

时间:2015-04-04 19:26:36

标签: ios swift scenekit

我创建了一个圆形数组对象,没问题。

当我旋转时,中心似乎有一个正弦或高斯函数。

相机为z 60,结构半径为30。

初始视图,没有工件 enter image description here

向上旋转90度,没有伪影 enter image description here

旋转180度,伪影出现在物体中心 enter image description here

继续轮换,神器还在那里。 enter image description 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

  }
}

2 个答案:

答案 0 :(得分:0)

使用这些设置

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

文物消失了。我认为这是zFar的一个问题,它应该将背面均匀地剪裁而不像镜头像差。

答案 1 :(得分:0)

Viewing frustum的退出可能是造成大多数问题的原因。然而,另一个常见的原因是误解了SCNView allowsCameraControl的行为,也就是当你捏合放大或缩小(更改相机的fieldOfView),但是点ofView'的立场提醒人们。

你的节点仍然站在pointOfView的后面,不管摄像机的zNear是多么小。因此你看到他们被剪掉了。在这种情况下,下面的代码可以帮助您,至少可以避免这个问题。

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