如何在水平面添加阴影?

时间:2019-04-20 11:54:00

标签: ios swift scenekit augmented-reality arkit

我有一个问题,在对象上的ARView显示阴影中,但未在表面上显示,我附加了尝试代码吗?它正在工作在对象上显示阴影,但不显示在表面上。 Show Image

代码:

var light2 = SCNLight()
var lightNodeb2 = SCNNode()
light2.castsShadow = true
light2.automaticallyAdjustsShadowProjection = true
light2.maximumShadowDistance = 40.0
light2.orthographicScale = 1
light2.type = .directional
light2.shadowMapSize = CGSize(width: 2048, height: 2048)
light2.shadowMode = .forward
light2.shadowSampleCount = 128
light2.shadowRadius = 3
light2.shadowBias  = 32
light2.zNear=1;
light2.zFar=1000;
lightNodeb2.light = light2
lightNodeb2.position = SCNVector3(x: -1, y: 10, z: 1)
lightNodeb2.rotation = SCNVector4Make(2, 0, 0, -Float.pi / 3) 
self.sceneView.scene.rootNode.addChildNode(lightNodeb2)

1 个答案:

答案 0 :(得分:1)

我在这里看到2种可能的问题:

您的灯光设置正常。我认为第一个问题是:您在“场景”图中将编程光与“非编程” 3D对象一起使用。

检查。在这段代码中,所有对象都是程序化的:

Shadow castings

所有对象On默认为func childNode(withName name: String, recursively: Bool) -> SCNNode? { return SCNNode() } let geometryNode = childNode(withName: "art.scnassets/your3Dmodel", recursively: true)! scene.rootNode.addChildNode(geometryNode)

enter image description here

第一个问题的解决方案:

  

要使您的3D模型对虚拟程序灯可用,请使用以下方法

hiddenPlaneNode.castsShadow = false
hiddenPlaneNode.geometry?.firstMaterial?.lightingModel = .constant
hiddenPlaneNode.geometry?.firstMaterial?.isDoubleSided = true
hiddenPlaneNode.geometry?.firstMaterial?.readsFromDepthBuffer = true
hiddenPlaneNode.geometry?.firstMaterial?.writesToDepthBuffer = true
hiddenPlaneNode.geometry?.firstMaterial?.colorBufferWriteMask = []

light2.shadowMode = .deferred

第二个问题的解决方案:

  

如果您想拥有一个带有阴影的隐藏平面,请使用以下代码

{{1}}