swift - 如果检测到多个透明平面,延迟阴影不起作用
问题描述
在我的代码中,我检测平面并显示平面上方物体的阴影。如果有一个平面,它可以正常工作,但如果它检测到多个平面,则会显示多余的阴影。
如图所示,在#1平面上,阴影是对的,但是如果我添加另一个平面#2,平面#2的阴影是错误的,即使我移除飞机,平面#1上的阴影也会消失,但是2 号飞机上的影子还在。我不想移除飞机#2,但是如何移除飞机#2 上的错误阴影?
请帮我修一下,谢谢。
编辑:如果我把飞机换成地板,会好很多。
解决方案
当您使用平面检测功能并希望将两个共面检测到的平面组合成更大的平面时,最好的方法是使用实renderer(_:didUpdate:for:)
例方法更新检测到的平面以获得一个ARPlaneAnchor
中心平面。
您的代码如下所示:
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer,
didUpdate node: SCNNode,
for anchor: ARAnchor) {
guard let planeAnchor = anchor as? ARPlaneAnchor,
let planeNode = node.childNodes.first,
let myPlane = planeNode.geometry as? SCNPlane
else { return }
let width = CGFloat(planeAnchor.extent.x)
let height = CGFloat(planeAnchor.extent.z)
myPlane.width = width
myPlane.height = height
let x = CGFloat(planeAnchor.center.x)
let y = CGFloat(planeAnchor.center.y)
let z = CGFloat(planeAnchor.center.z)
planeNode.position = SCNVector3(x, y, z)
}
}
附言
这段代码的关键不是更新本身,而是你得到一个更大的单平面而不是两个不同的共面平面这一事实。因此,这架飞机捕捉到的阴影必须按预期工作。
如果您想使用无限平面 (SCNFloor),这取决于您,但如果您跟踪像桌面这样的非无限表面,它就无效。
推荐阅读
- android - 在android中将字符串日期转换为毫秒
- vaadin - 使用 Vaadin 14 初始化 VaadinServlet 时出现 NullPointerException
- python - Apache-Tika 服务器如何在本地设备中工作?
- html - CSS响应式画廊在几行后中断
- assembly - x86 程序集 MASM 中零标志的默认值是多少?
- javascript - db.collection.find() 在 node.js 中返回空数组,但在 mongo shell 中正常工作
- reactjs - 无法让 onOpening 道具为 react-collapsible 包工作
- c# - .net core & microsoft 身份框架和 Azure AD 多重身份验证方案
- unreal-engine4 - 如何创建蓝图以在球击中两次时摧毁砖块?(并且第一次接触后,砖块需要改变颜色)
- javascript - 怎么做?(oop Slider javascript 和 jquery)