## 実現したいこと
ARで表示しているオブジェクトを2つ選択して1つ目に選択したものと、2つ目に選択したものを判定して表示されている3Dモデルが同一であるかの判定を行いたい
困っていること
オブジェクトが同一であるかの判定をおこなうのにEntityの保持しているどのプロパティを使って判定を行えば良いのかわからず困っています。
コード
現在はARで台座の上にusdzのモデルを表示してそのモデルをタップするところまでできています。
コードは以下です。
import UIKit import RealityKit import Combine class ViewController: UIViewController { @IBOutlet var arView: ARView! var daizas:[Entity] = [] override func viewDidLoad() { super.viewDidLoad() let anchor:AnchorEntity = AnchorEntity(plane: .horizontal,minimumBounds: [0.2, 0.2]) arView.scene.addAnchor(anchor) //台座の作成 for _ in 1...4 { let box = MeshResource.generateBox(width: 0.04, height: 0.002, depth: 0.04) let metalMaterial = SimpleMaterial(color: .gray, isMetallic: true) let model = ModelEntity(mesh: box, materials: [metalMaterial]) model.generateCollisionShapes(recursive: true) daizas.append(model) } for (index, daiza) in daizas.enumerated() { let x = Float(index % 4) let z = Float(index / 4) daiza.position = [x * 0.1, 0, z * 0.1] anchor.addChild(daiza) } var cancellable: AnyCancellable? = nil //TODO: モデルのサイズがバラバラになってしまっているので統一する cancellable = ModelEntity.loadModelAsync(named: "01") .append(ModelEntity.loadModelAsync(named: "02")) .collect() .sink(receiveCompletion: { error in print("error:(error)") cancellable?.cancel() }, receiveValue: { entities in var objects: [ModelEntity] = [] for entity in entities { entity.setScale(SIMD3<Float>(0.002, 0.002, 0.002),relativeTo: anchor) entity.generateCollisionShapes(recursive: true) for _ in 1...2 { objects.append(entity.clone(recursive: true)) } } //台座にARオブジェクトを追加する for (index, object) in objects.enumerated() { self.daizas[index].addChild(object) } cancellable?.cancel() }) } @IBAction func tapObject(_ sender: UITapGestureRecognizer) { let tapLogation = sender.location(in: arView) if let object = arView.entity(at: tapLogation) { // ここで選択したものが一致しているかを判定したい } } }
あなたの回答
tips
プレビュー