如何解决从AR骰子面快速检测值
我已经使用ARkit和Scenekit在检测到水平面时显示骰子模型。我想检测掷骰子后显示在骰子上的值,以便可以实现任何其他游戏逻辑。如何识别AR骰子中显示的点数?
override func touchesMoved(_ touches: Set<UITouch>,with event: UIEvent?) {
//1. Get The Current Touch Point
guard let currentTouchPoint = touches.first?.location(in: sceneView) else {
return
}
//2. Get The Next Feature Point Etc
guard let hitTest = sceneView.hitTest(currentTouchPoint,types: .existingPlane).first else { return }
//3. Convert To World Coordinates
let worldTransform = hitTest.worldTransform
let scene = SCNScene(named: "art.scnassets/diceCollada.scn")
if let diceNode = scene?.rootNode.childNode(withName: "Dice",recursively: true) {
diceNode.position = SCNVector3(worldTransform.columns.3.x,worldTransform.columns.3.y + diceNode.boundingSphere.radius,worldTransform.columns.3.z)
sceneView.scene.rootNode.addChildNode(diceNode)
roll(dice: diceNode)
}
//4. Set The New Position
let newPosition = SCNVector3(worldTransform.columns.3.x,worldTransform.columns.3.y,worldTransform.columns.3.z)
dice.simdPosition = SIMD3(newPosition.x,newPosition.y,newPosition.z)
}
解决方法
一种非常简单的方法,添加6个不可见的SUB节点-分别命名为1,2,3.4 ..-将它们放置在每个边缘的正中间。滚动之后,Y值最高的节点(假设Y向上)是您的答案。比较6,Y轴最高=节点名称。
编辑请求... 创建一个edge1Node = SCNBox(小尺寸),设置其位置。您必须进行试验,因为我不知道您的对象的大小,但是可能以X-1,y = 0,z = 0开头,直到您看到它为止。这是您与骰子节点的偏移量,因此添加diceNodeName.addChild(edge1Node)。现在您有了一个节点,即使它旋转或移动,它也将与diceNode保持关联,因此只需调整大小并移动它,直到它到达多维数据集的边缘为止-从技术上讲,它甚至不必是完美的-没人会这样做不管怎么说,这只是两边的区别。完成1次,再执行5次-现在所有6个子节点都与骰子节点一起移动-那么很容易看出哪个子节点高于其他子节点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。