2017-11-07 11 views
0

나는 SpriteKit과 ARKit을 실험하고 있으며 같은 장면에서 두 ARCorchors 사이의 각도를 어떻게 계산할 수 있는지 궁금합니다.두 ARAnchors 사이의 각도

이것은 세계에서 앵커의 위치를 ​​파악하고 수평면 (또는 다른 임의의 평면)에 정의하는 선의 각도를 계산하는 것을 의미합니다.

감사합니다.

+3

[3D에서 두 선 사이의 각도] (https://stackoverflow.com/questions/46790176/angle-between-2-lines-in-3d)의 가능한 복제본 – Knight0fDragon

답변

0

먼저 두 앵커 모두 월드 위치를 가져와야합니다. 이 좌표는 다음과 같이 각 앵커 변환에서 검색 할 수 있습니다.

let transform = anchor.transform 
let position = vector_float3.init(transform.columns.3.x, transform.columns.3.y, transform.columns.3.z) 

이제 각 앵커에 대해 공간에서 두 점을 사용할 수 있습니다. p1p2으로 전화 할 수 있습니다. 수평각을 계산하려면 세 번째 점이 필요합니다.

우리 앵글의 버텍스가 p1 인 경우이 새로운 포인트는 p1과 같지만 바로 아래 또는 위 p2과 같은 y 좌표를 갖습니다. 그래서 :

let p2Hor = vector_float3.init(p2.x, p1.y, p2.z) 

우리가 점 (p2p2Hor)과 내적 각각의 정점 (p1)에서 정규화 된 벡터를 필요로하는 각도를 계산합니다. vector_float3simd 모듈을 사용한 작업은 비교적 쉽습니다. 정규화 된 벡터는 다음과 같이 계산된다 :

let p1ToP2Norm = normalize(p2 - p1) 
let p1ToP2HorNorm = normalize(p2Hor - p1) 

도트 생성물 (라디안)

let dotProduct = dot(p1ToP2Norm, p1ToP2HorNorm) 

각도 것은 :

let angle = acos(dotProduct) 

이 모든 vector_float3 대한 확장자 ARKit은 신속하게 :

import ARKit 
import simd 


extension vector_float3 { 

    /// Returns the angle of a line defined by to points to a horizontal plane 
    /// 
    /// - Parameters: 
    /// - p1: p1 (vertice) 
    /// - p2: p2 
    /// - Returns: angle to a horizontal crossing p1 in radians 
    static func angleBetweenPointsToHorizontalPlane(p1:vector_float3, p2:vector_float3) -> Float { 

     ///Point in 3d space on the same level of p1 but equal to p2 
     let p2Hor = vector_float3.init(p2.x, p1.y, p2.z) 

     let p1ToP2Norm = normalize(p2 - p1) 
     let p1ToP2HorNorm = normalize(p2Hor - p1) 

     let dotProduct = dot(p1ToP2Norm, p1ToP2HorNorm) 

     let angle = acos(dotProduct) 

     return angle 
    } 
}