在SceneKit / ARKit中出现隐形阴影平面问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SceneKit / ARKit中出现隐形阴影平面问题相关的知识,希望对你有一定的参考价值。

我有一段时间寻找我的问题的答案,但找不到真正有用的东西,或者解释发生了什么。我也一遍又一遍地检查我在SO上发现的一切,但找不到答案。

在AR World中显示对象时,问题会持续发生。 iEx我将一个物体放在地板上的一个平面上,这是我看不见的暗影平面。然后它取决于设备的视角。为了澄清,我添加了图像,其视角略有不同。看看阴影发生了什么:

enter image description here

我希望一直有一个好的影子,而不是你能看到的那些人工制品。

注意:我已经玩过使用shadowSampleCount,Bias和所有其他选项,这应该有助于获得正确的,低渲染成本的阴影。

以下是照明和平面,材料等相关代码的摘录

对于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)

}

我究竟做错了什么?有人可以帮忙吗?

答案

还有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关闭时:

光,像一个相机,有nearfar剪裁平面安装。

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

enter image description here

希望这可以帮助。

以上是关于在SceneKit / ARKit中出现隐形阴影平面问题的主要内容,如果未能解决你的问题,请参考以下文章

将孩子添加到场景 ARKit/SceneKit 时 FPS 下降

ARKit + SceneKit:将重建场景用于物理?

SceneKit + ARKit:无需相机滚动的广告牌

如何为 ARKit 将 dae 导入 SceneKit

在 ARkit 中未检测到 SceneKit 碰撞

如何在 iOS 11 中将 SKVideoNode 添加到 ARKit-SceneKit?