AR シーンでインスタンス化された SCNNode のタップを検出しようとしています。ここでの SceneKit のヒット テストの結果のようには機能しないようで、Scene Kit の経験はあまりありません。
タップされたポイントがシーン内のノードに含まれているかどうかを検出して、オブジェクトのタップを検出したいだけです。私が他の答えから試したこと:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let results = sceneView.hitTest(touch.location(in: sceneView), types: [ARHitTestResult.ResultType.featurePoint])
guard let hitFeature = results.last else { return }
let hitTransform = SCNMatrix4.init(hitFeature.worldTransform)
let hitPosition = SCNVector3Make(hitTransform.m41,
hitTransform.m42,
hitTransform.m43)
if(theDude.node.boundingBoxContains(point: hitPosition))
{
}
}
私が得た最後のifステートメントでは何も出力されません:
extension SCNNode {
func boundingBoxContains(point: SCNVector3, in node: SCNNode) -> Bool {
let localPoint = self.convertPosition(point, from: node)
return boundingBoxContains(point: localPoint)
}
func boundingBoxContains(point: SCNVector3) -> Bool {
return BoundingBox(self.boundingBox).contains(point)
}
}
struct BoundingBox {
let min: SCNVector3
let max: SCNVector3
init(_ boundTuple: (min: SCNVector3, max: SCNVector3)) {
min = boundTuple.min
max = boundTuple.max
}
func contains(_ point: SCNVector3) -> Bool {
let contains =
min.x <= point.x &&
min.y <= point.y &&
min.z <= point.z &&
max.x > point.x &&
max.y > point.y &&
max.z > point.z
return contains
}
}
にはノードが含まれてARHitTestResult
いません。ARScene でノードのタップを検出するにはどうすればよいですか?