Добавить тень к SCNPlane - PullRequest
2 голосов
/ 20 июня 2019

У меня есть ARKit приложение.И я хочу, чтобы у моих работ была тень.Тень не должна быть динамичной.Просто статичная тень.

Я пытался добавить плоскость за иллюстрацией.И установить тень на это.Но я обнаружил, что это не легко.

Можете ли вы помочь мне?

let shadow = SCNPlane(width: artwork.size.width * 0.0254 + 0.03, height: artwork.size.height * 0.0254 + 0.015)

let layer = CALayer()
layer.frame = CGRect(origin: .zero, size: CGSize(width: shadow.width, height: shadow.height))
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = 1
layer.shadowOffset = .zero
layer.shadowRadius = 10

shadow.firstMaterial?.diffuse.contents = layer

Тень должна быть как в UIKit's UIView.Но этот код просто не работает.

Мне нужно что-то вроде this

1 Ответ

0 голосов
/ 20 июня 2019

ОБНОВЛЕНО .

Чтобы отбрасывать и получать тени от 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 (просто перетащите ее на рабочий стол):

enter image description here

Вы можете изменить его размер и прозрачность и, конечно, вы можете размыть его.

...