이것은 ARKit에 대해 지금까지 얻은 것입니다.
@objc func tap(_ sender: UITapGestureRecognizer){
let touchLocation = sender.location(in: sceneView)
let hitTestResult = sceneView.hitTest(touchLocation, types: .featurePoint)
if let hitResult = hitTestResult.first{
if first == nil{
first = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
}else if second == nil{
second = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
}else{
third = SCNVector3Make(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
let x2 = first!.x
let z2 = -first!.z
let x1 = second!.x
let z1 = -second!.z
let z3 = -third!.z
let m = (z1-z2)/(x1-x2)
var a = atan(m)
if (x1 < 0 && z1 < 0){
a = a + (Float.pi*2)
}else if(x1 > 0 && z1 < 0){
a = a - (Float.pi*2)
}
sceneView.scene.rootNode.addChildNode(yourNode)
let rotate = SCNAction.rotateBy(x: 0, y: CGFloat(a), z: 0, duration: 0.1)
yourNode.runAction(rotate)
yourNode.position = first!
if z3 - z1 < 0{
let rotate = SCNAction.rotateBy(x: 0, y: CGFloat.pi, z: 0, duration: 0.1)
yourNode.runAction(rotate)
}
}
}
}
이론이다
만드는 세 개의 점 A, B, C는 AB AC 직교하도록. 도트를 A-B-C 순서로 누릅니다.
노드에 필요한 회전을 제공하는 ARSceneView의 x = 0에서 AB 각도를 찾습니다.
포인트 중 하나를 다시 배치하여 위치 대 배치 노드를 계산할 수 있습니다.
C 발견 노드를 뒤집을 필요가 있는지 찾습니다.
저는 아직 만족해야 할 몇 가지 예외에 대해 작업하고 있습니다.
무료로 마커 감지에 aruco를 사용할 수 있습니다. 초기화 단계 만 사용하려는 마커 추적이 필요하지 않습니다. – ibrahim
할 수있는 한 가지 방법은 3 점 마커를 사용하는 것입니다. 그것들을 가볍게 두드리면 모델이 놓일 위치와 방향을 계산할 수 있습니다. 마커가 수평면에 있으면 작동합니다. –
질문은 탐지 된 마커의 방향/위치를 ARKit/ARCore에 개체를 배치하는 워크 플로로 전송하는 방법입니다. 이러한 솔루션은 "탐지 된 비행기에서 clickevent를 감지하고 객체를 연결하는"이벤트를 찾고 있다고 생각합니다. 제 경우에는 "마커 위치를 잡고 그것을 탐지 된 비행기에 적용"합니다. 그러나이 단계는 이러한 프레임 워크에 대한 사소한 사례가 아닙니다 (?) – user2463728