Как добавить тень на плоскость поверхности? - PullRequest
1 голос
/ 20 апреля 2019

У меня есть одна проблема, в ARView Display Shadow на объекте, но не отображается на поверхности, я приложил пробный код? Он работает Показать тень на объекте, но не отображается на поверхности. Показать изображение

Код:

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 Ответ

1 голос
/ 20 апреля 2019

Я вижу здесь 2 возможных проблемы:

Настройки вашего освещения в порядке. Я думаю, что первая проблема заключается в следующем: вы используете программный свет с «непрограммированными» трехмерными объектами в графе сцены.

Проверьте это. В этом коде все объекты являются программными:

let sphereNode1 = SCNNode(geometry: SCNSphere(radius: 1))
sphereNode1.position = SCNVector3(x: 0, y: 5, z: 3)
scene.rootNode.addChildNode(sphereNode1)

let sphereNode2 = SCNNode(geometry: SCNSphere(radius: 3))
sphereNode2.position = SCNVector3(x: 0, y: 1, z: 0)
scene.rootNode.addChildNode(sphereNode2)

let boxNode = SCNNode(geometry: SCNBox(width: 20, height: 0.1, length: 20, chamferRadius: 0))
boxNode.position = SCNVector3(x: 0, y: -3, z: 0)
scene.rootNode.addChildNode(boxNode)

let light2 = SCNLight()
let 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 = .deferred    // Renders shadows in a postprocessing pass

light2.shadowSampleCount = 128
light2.shadowRadius = 3
light2.shadowBias = 32
light2.zNear = 1
light2.zFar = 1000
lightNodeb2.light = light2

// DIRECTIONAL LIGHT POSITION doesn't matter. Matters only its direction.
// lightNodeb2.position = SCNVector3(x: -1, y: 10, z: 1)

lightNodeb2.rotation = SCNVector4(2, 0, 0, -Float.pi/3)
scene.rootNode.addChildNode(lightNodeb2)

Все объекты Shadow castings по умолчанию On.

enter image description here

Решение первой проблемы:

Чтобы ваша 3D-модель стала доступной для виртуальных программных источников света, используйте следующий подход :

func childNode(withName name: String, recursively: Bool) -> SCNNode? {
    return SCNNode()
}  

let geometryNode = childNode(withName: "art.scnassets/your3Dmodel", 
                             recursively: true)!

scene.rootNode.addChildNode(geometryNode)

Решение второй проблемы:

И если вы хотите иметь скрытый самолет с тенью, используйте этот код :

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
...