これは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)
}
}
}
}
理論である:
にする3つの点A、B、C ABはACに垂直であるように。ドットをA-B-Cの順にタップします。
ノードに必要な回転を与えるARSceneViewのx = 0におけるABの角度を求めます。
ポイントのいずれかを再配置して、配置先ノードを計算することができます。
Cノードから、ノードを反転する必要があるかどうかを確認します。
私はまだ満足する必要があるいくつかの例外に取り組んでいます。
無料でマーカーを検出するためにarucoを使用できます。初期化フェーズのみを使用したいと思っているマーカートラッカーが必要ありません。 – ibrahim
あなたができることの1つは、3点マーカーを使用することです。それらをタップして配置するモデルの位置と向きを計算します。マーカーが水平面に置かれている場合に機能します。 –
質問は、検出されたマーカーの方向/位置をARKit/ARCoreにオブジェクトを配置するワークフローにどのように転送するかです。私はそれらの解決策が "検出された飛行機の上のclickeventを検出し、オブジェクトを接続する"のようなイベントを探していると思います。私の場合、それは「私のマーカ位置をとり、それを検出された平面に適用する」でしょう。しかし、このステップは、これらのフレームワークにとって些細なケースではないようです(?) – user2463728