【问题标题】:Strange behavior with SceneKit NodeSceneKit 节点的奇怪行为
【发布时间】:2015-06-09 15:03:58
【问题描述】:

我创建了一个循环数组对象,没问题。

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

相机是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

  }
}

【问题讨论】:

  • 我不是 scenekit pro,但是对于 30 的半径,如果相机 z 定义了对象必须移动的空间,我认为 60 不足以高度非零的圆柱体。如果您使用更大的相机 z(或更小半径)会发生什么?
  • 我认为你是对的,它是 xFov、yFov、zNear、zFar 的组合......最初我认为可能是一种奇怪的剔除效果。
  • 这些设置终于奏效了cameraNode.camera?.xFov = 60 cameraNode.camera?.yFov = 60 cameraNode.camera?.zFar = 1000 cameraNode.camera?.zNear = 0.01

标签: ios swift scenekit


【解决方案1】:

使用这些设置

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

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

【讨论】:

  • 正在均匀地剪辑。意识到你的戒指是倾斜的。把后墙想象成一堵光墙。当您将圆柱体倾斜到这道光墙中时,请考虑一下光线将开始照射在哪些部分上的方式......
【解决方案2】:

退出Viewing frustum 可能是导致最多问题的原因。然而还有一个常见的原因是误解了SCNView的allowsCameraControl的行为,那就是当你捏拉放大或缩小(改变相机的fieldOfView),但是pointOfView的位置却提示相同。

无论相机的 zNear 有多小,您的节点仍然位于 pointOfView 的后面。因此,您会看到它们被剪掉了。在这种情况下,下面的代码可能会对您有所帮助,至少可以避免问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 2021-06-27
    • 2012-07-19
    相关资源
    最近更新 更多