Проблема с невидимым Shadow Plane в SceneKit / ARKit - PullRequest
3 голосов
/ 14 марта 2019

Некоторое время я смотрю вокруг, чтобы найти ответы на свои вопросы, но не могу найти ничего, что действительно помогает или объясняет, что происходит.Я также снова и снова проверял все, что нашел в SO, но не смог найти ответ.

Проблема возникает постоянно при отображении объектов в мире AR.Я помещаю объект на самолет на полу, который является моей невидимой плоскостью теней.Тогда все зависит от угла обзора с устройства.Для пояснения я добавил к изображениям, у которых просто немного другой угол обзора.Посмотрите, что происходит с тенями:

enter image description here

Я хотел бы иметь хорошую тень все время, а не такие артефакты, как вы можете видеть.

Примечание. Я уже поиграл, используя shadowSampleCount , смещение и все другие параметры, которые должны помочь получить правильную тень с низкой стоимостью рендеринга.

Вот выдержка из соответствующего кода для освещения и плоскости, материала и т. Д.

для SCNLight :

class func directionalLight() -> SCNLight {

    let light = SCNLight()

    light.type = .directional
    light.castsShadow = true
    light.color = UIColor.white
    light.shadowMode = .deferred
    light.shadowSampleCount = 8
    light.shadowRadius = 1
    // light.automaticallyAdjustsShadowProjection = false
    light.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.75)
    light.categoryBitMask = -1

    return light

}

и того, как я его добавляю:

func setupLights() {

    lightDirectionNode.light = Lighting.directionalLight()
    // lightDirectionNode.eulerAngles = SCNVector3(-66.degreesToRadians, 0, 0)
    lightDirectionNode.eulerAngles = SCNVector3(0, 90.degreesToRadians, 45.degreesToRadians)
    sceneView.scene.rootNode.addChildNode(lightDirectionNode)

}

Для SCNPlane :

class func shadowPlane() -> SCNNode {

    let objectShape = SCNPlane(width: 200, height: 200)
    objectShape.heightSegmentCount = 2
    objectShape.widthSegmentCount = 2
    objectShape.cornerRadius = 100
    objectShape.cornerSegmentCount = 16

    let objectNode = SCNNode(geometry: objectShape)

    objectNode.geometry?.firstMaterial?.diffuse.contents = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
    objectNode.geometry?.firstMaterial?.colorBufferWriteMask = SCNColorMask(rawValue: 0)

    objectNode.physicsBody = Physics.floorPhysicsBody(shape: objectShape)
    objectNode.name = "floor"
    objectNode.renderingOrder = -10 // renderingOrder // 0

    return objectNode
}

и как мне его добавить:

func setupShadowPlane() {

    let shadowPlane = NodeFactory.shadowPlane()

    // Set the Node's properties
    shadowPlane.position = SCNVector3(x: (focusSquare.lastPosition?.x)!, y: (focusSquare.lastPosition?.y)!, z: (focusSquare.lastPosition?.z)!)
    shadowPlane.eulerAngles = SCNVector3(-90.degreesToRadians, 0.0, 0.0)
    sceneView.scene.rootNode.addChildNode(shadowPlane)

}

Что я делаю не так?Кто-нибудь может помочь?

1 Ответ

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

Есть еще 3 свойства экземпляра, которые необходимо учитывать:

var shadowRadius: CGFloat { get set }
var shadowCascadeCount: Int { get set }
var shadowCascadeSplittingFactor: CGFloat { get set }

Если вы не настроите эти, они определенно вызывают артефакты рендеринга.

let lightNode = SCNNode()
lightNode.light = SCNLight()
// POSITION OF DIRECTIONAL LIGHT ISN'T IMPORTANT.
// ONLY DIRECTION IS CRUCIAL FOR DIRECTIONAL LIGHTS.
lightNode.rotation = SCNVector4(x: 0, y: 0, z: 0, w: 1)
lightNode.light!.type = .directional
lightNode.castsShadow = true
lightNode.light?.shadowMode = .deferred

/* THREE INSTANCE PROPERTIES TO SETUP */
lightNode.light?.shadowRadius = 3.25
lightNode.light?.shadowCascadeCount = 3
lightNode.light?.shadowCascadeSplittingFactor = 0.09

lightNode.light?.shadowColor = UIColor(white: 0, alpha: 0.75)
scene.rootNode.addChildNode(lightNode)

И еще одна вещь - когда Auto Adjust выключен :

У света, как у камеры, есть near и far плоскостей отсечения для настройки.

lightNode.light?.zNear = 0
lightNode.light?.zFar = 1000000    // Far Clipping Plane is important 

enter image description here

Надеюсь, это поможет.

...