您知道,例如有两个处于相同位置的平面时,它们会以不同的颜色开始相互作斗争,因此有些零件是另一种质感,而另一些则是其他部分。
我认为Scenekit的RenderingOrder应该解决此问题,但我无法正常工作。我给了Planea 0用于RenderingOrder和PlaneB 1,但什么也没发生。
基本上,我想在同一位置有两架飞机,但我希望另一个飞机是"主导地位",以便将主导平面呈现,而不是另一个。
这通常称为Z-tighting,并且只要存在3D,就一直是3D的问题。
有两种基本的方法,也不是理想的方法来解决这一问题,因为我目前对您的情况有所了解:
1。删除您不想看到的平面,直到您需要它,可能是当相机围绕另一侧或其他条件发生变化时,您'LL需要添加所需的飞机,然后卸下另一个。
2。在" Z空间"中稍微分开,或者有意义地将它们推到如此略微分开的任何空间中。这可能是一个非常少量的,很小,以至于观众不可能认为飞机不在完全相同的空间中。
对于2022。幸运的是,解决方案现在很简单,调整深度缓冲区的使用。
for i in 0..<theRelevantNodes.count {
let n = theRelevantNodes[i]
n.geometry?.firstMaterial?.readsFromDepthBuffer = false
}
通常,您只想使用深度缓冲区信息禁用,幸运的是现在很容易。
.writesToDepthBuffer
也可用。
确实 - 如果实际上需要 - 您可以明确设置每个项目的.renderingOrder
。请注意,.renderingOrder
是节点本身的属性,而不是材料的属性。
对深度缓冲区的完整讨论超出了质量检查的范围,但幸运的是,这两个布尔人只有四个可能性,因此请尝试所有四个!
请注意,如果您使用焦点效应,可能会受到影响。
如果相关,则Draw性能可能会以一种或另一种方式影响。
在代表垂直平面的重叠框时有类似的问题。
,如果您不使用透明节点,则可能对您有用(我确实如此,所以我的问题仍然存在,我将在解决时进行更新(:
使用包含所有飞机几何形状的扁平节点。您可以将所有节点的儿童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)
}
}