나는 SpriteKit과 ARKit을 실험하고 있으며 같은 장면에서 두 ARCorchors 사이의 각도를 어떻게 계산할 수 있는지 궁금합니다.두 ARAnchors 사이의 각도
이것은 세계에서 앵커의 위치를 파악하고 수평면 (또는 다른 임의의 평면)에 정의하는 선의 각도를 계산하는 것을 의미합니다.
감사합니다.
나는 SpriteKit과 ARKit을 실험하고 있으며 같은 장면에서 두 ARCorchors 사이의 각도를 어떻게 계산할 수 있는지 궁금합니다.두 ARAnchors 사이의 각도
이것은 세계에서 앵커의 위치를 파악하고 수평면 (또는 다른 임의의 평면)에 정의하는 선의 각도를 계산하는 것을 의미합니다.
감사합니다.
먼저 두 앵커 모두 월드 위치를 가져와야합니다. 이 좌표는 다음과 같이 각 앵커 변환에서 검색 할 수 있습니다.
let transform = anchor.transform
let position = vector_float3.init(transform.columns.3.x, transform.columns.3.y, transform.columns.3.z)
이제 각 앵커에 대해 공간에서 두 점을 사용할 수 있습니다. p1
및 p2
으로 전화 할 수 있습니다. 수평각을 계산하려면 세 번째 점이 필요합니다.
우리 앵글의 버텍스가 p1
인 경우이 새로운 포인트는 p1
과 같지만 바로 아래 또는 위 p2
과 같은 y 좌표를 갖습니다. 그래서 :
let p2Hor = vector_float3.init(p2.x, p1.y, p2.z)
우리가 점 (p2
및 p2Hor
)과 내적 각각의 정점 (p1
)에서 정규화 된 벡터를 필요로하는 각도를 계산합니다. vector_float3
및 simd
모듈을 사용한 작업은 비교적 쉽습니다. 정규화 된 벡터는 다음과 같이 계산된다 :
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
}
}
[3D에서 두 선 사이의 각도] (https://stackoverflow.com/questions/46790176/angle-between-2-lines-in-3d)의 가능한 복제본 – Knight0fDragon