Xamarin/SceneKit/ARKit:如何在命中测试中检测多个物体?
解决Xamarin iOS ARKit命中测试仅返回单个结果的问题
嘿,我看你在Xamarin iOS 11.3的AR演示里碰到了命中测试只返回单个结果的问题——你的代码里已经把FirstFoundOnly设为false、SortResults设为true,理论上应该能拿到多个命中结果,但实际没生效,可能有几个容易忽略的原因:
- 物体空间重叠/遮挡问题:如果场景里的3D物体是完全重叠的,或者后面的物体被前面的完全挡住,ARKit的命中测试大概率只会检测到最靠前的那个。你可以检查下物体的位置布局,确保它们在空间上有部分分离,或者至少有重叠区域但不是完全覆盖的状态。
- 显式设置搜索模式:你提到了
OptionSearchMode,这个参数默认是SCNHitTestSearchMode.All,但有时候显式设置能解决隐性的逻辑问题。试试给options加上这行代码:
这个枚举值会强制命中测试遍历所有可能的碰撞面,不会提前终止检测。options.SearchMode = SCNHitTestSearchMode.All; - 碰撞体配置不完整:如果你的SCNNode没有正确设置碰撞体,或者碰撞体的形状和视觉模型不匹配,会导致命中测试无法识别到后面的物体。确保每个需要被检测的节点都配置了合适的碰撞体,比如:
node.PhysicsBody = SCNPhysicsBody.CreateStaticBody(); node.PhysicsBody.CollisionShape = SCNPhysicsShape.Create(node.Geometry, new SCNPhysicsShapeOptions()); - iOS版本的遗留bug:iOS 11.3是ARKit早期版本,可能存在一些命中测试相关的已知bug。如果设备允许的话,尝试升级到更高的iOS版本,或者查看Apple开发者文档里的iOS 11.3 ARKit已知问题,看看有没有对应的修复说明。
- 确认点击点覆盖多个物体:你需要确保用来测试的屏幕坐标
point确实落在多个3D物体的投影范围内。可以通过打印每个物体的屏幕投影位置来验证,比如用sceneView.ProjectPoint(node.Position)获取节点的屏幕坐标,对比点击点是否同时在多个节点的覆盖区域内。
最后,建议你在代码里加一段打印逻辑,方便排查命中结果的细节:
Console.WriteLine($"命中结果数量:{hits.Count}"); foreach(var hit in hits) { Console.WriteLine($"命中节点名称:{hit.Node.Name ?? "未命名节点"}"); }
内容的提问来源于stack exchange,提问作者adamb
相关产品推荐
相关产品推荐

