ОБНОВЛЕНО .
Чтобы отбрасывать и получать тени от 3D-источников света, вы должны использовать 3D-примитивы (такие как куб, сфера, цилиндр и т. Д.) Или 3D-модели в таких форматах, как .usdz
, .dae
или * 1007. *.
Тень на видимой плоскости.
Используйте следующий код для проверки того, как свет генерирует тени для трехмерной геометрии:
let scene = SCNScene()
let lightNode = SCNNode()
lightNode.light = SCNLight()
lightNode.light!.type = .spot
lightNode.light!.castsShadow = true
lightNode.light!.shadowMode = .deferred
lightNode.rotation = SCNVector4(x: -1, y: 0, z: 0, w: CGFloat.pi/2)
lightNode.position = SCNVector3(x: 0, y: 20, z: 0)
scene.rootNode.addChildNode(lightNode)
let sphereNode = SCNNode()
sphereNode.geometry = SCNSphere(radius: 2)
sphereNode.position = SCNVector3(x: 0, y: -2, z: 0)
scene.rootNode.addChildNode(sphereNode)
let planeNode = SCNNode()
planeNode.geometry = SCNPlane(width: 15, height: 15)
planeNode.position = SCNVector3(x: 0, y: -5, z: 0)
planeNode.rotation = SCNVector4(x: -1, y: 0, z: 0, w: CGFloat.pi/2)
planeNode.geometry?.materials.first?.diffuse.contents = UIColor.red
scene.rootNode.addChildNode(planeNode)
Тень на невидимой плоскости.
Если вам нужна невидимая плоскость , которая получает тень , используйте следующий код:
planeNode.geometry?.materials.first?.colorBufferWriteMask = []
planeNode.geometry?.materials.first?.writesToDepthBuffer = true
planeNode.geometry?.materials.first?.lightingModel = .constant
Поддельная тень.
И если вы хотите использовать искусственную тень , записанную как .png
(формат файла png может содержать 4 канала) текстуры на геометрии (с предварительно умноженным альфа-каналом - RGB x A), используйте следующий подход:
planeNode.geometry?.materials.first?.diffuse.contents = UIImage(named: "shadow.png")
lightNode.light!.castsShadow = false
Вот мой ответ о поддельных тенях.
А вот ваша предварительно умноженная тень в формате .png
(просто перетащите ее на рабочий стол):
Вы можете изменить его размер и прозрачность и, конечно, вы можете размыть его.