【问题标题】:Disabling the flickering of overlapping planes禁用重叠平面的闪烁
【发布时间】:2020-04-26 21:06:45
【问题描述】:

您知道,例如,当两个平面处于相同位置,颜色不同时,它们会开始相互争斗,因此有些部分是另一种纹理,有些部分是其他的。

我认为 Scenekit 的 renderOrder 应该可以解决这个问题,但我无法让它工作。我给了 planeA 0 用于 renderOrder 和 planeB 1,但什么也没发生。

所以基本上我想让两个平面在同一个位置,但我希望另一个是“主导”的,这样主导平面将被渲染,而不是另一个。

【问题讨论】:

    标签: scenekit


    【解决方案1】:

    这通常被称为 Z-fighting,只要 3D 存在,它就一直是 3D 中的一个问题。

    就我目前对您的情况的理解而言,有两种基本但不理想的方法来处理这个问题:

    1. 移除你不想看到的飞机,直到你需要它,可能是当相机绕过另一边,或者其他一些条件发生变化时,此时你'您需要添加您需要的飞机,然后删除另一个。

    2. 在“Z 空间”中将它们稍微分开,或者在任何有意义的空间中将它们稍微分开。这可能是一个非常小的数量,小到观察者不可能感知到这些平面不在完全相同的空间中。

    【讨论】:

      【解决方案2】:

      在表示垂直平面的重叠框方面存在类似问题。

      如果您不使用透明节点,这里有一个可能对您有用的解决方案(我这样做了,所以我的问题仍然存在,解决后我会更新):

      使用包含所有平面几何图形的扁平节点。您可以使用flattenedClone() 展平所有节点的子节点。然后在每次添加更多平面节点时展平,即:

      class myClass {
          //Accumulate planes into this node
          var flattenedNode = SCNNode()
      
          func addPlaneNode(_ newPlane: SCNNode) {
              flattenedNode.removeFromParentNode()
              flattenedNode.addChildNode(newPlane)
              flattenedNode = flattenedNode.flattenedClone()
              rootNode.addChildNode(flattenedNode)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-21
        • 1970-01-01
        • 2014-02-01
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        相关资源
        最近更新 更多