两个 ARAnchors 之间的角度
Angle between two ARAnchors
我正在试验 SpriteKit 和 ARKit,想知道如何计算同一场景中两个 ARAnchors 之间的角度。
这意味着获取锚点在世界上的位置并计算它们定义的线与水平面(或另一个任意平面)的角度。
谢谢
首先我们需要获得两个锚点的世界位置。这些坐标可以从每个锚点变换中检索,如下所示:
let transform = anchor.transform
let position = vector_float3.init(transform.columns.3.x, transform.columns.3.y, transform.columns.3.z)
现在我们可以在 space 中为每个锚点设置两个点。让我们称它们为 p1
和 p2
。要计算与水平面的角度,我们需要第三个点。
如果我们角度的顶点是 p1
,这个新点将具有与 p1
相同的 y 坐标,但在 p2
的下方或上方。所以:
let p2Hor = vector_float3.init(p2.x, p1.y, p2.z)
要计算角度,我们需要从顶点 (p1
) 到每个点(p2
和 p2Hor
)的归一化向量及其点积。 vector_float3
和 simd
模块的那些操作相当容易。归一化向量计算如下:
let p1ToP2Norm = normalize(p2 - p1)
let p1ToP2HorNorm = normalize(p2Hor - p1)
点积:
let dotProduct = dot(p1ToP2Norm, p1ToP2HorNorm)
角度(弧度)为:
let angle = acos(dotProduct)
ARKit swift 中 vector_float3
的扩展中的所有这些:
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
}
}
我正在试验 SpriteKit 和 ARKit,想知道如何计算同一场景中两个 ARAnchors 之间的角度。
这意味着获取锚点在世界上的位置并计算它们定义的线与水平面(或另一个任意平面)的角度。
谢谢
首先我们需要获得两个锚点的世界位置。这些坐标可以从每个锚点变换中检索,如下所示:
let transform = anchor.transform
let position = vector_float3.init(transform.columns.3.x, transform.columns.3.y, transform.columns.3.z)
现在我们可以在 space 中为每个锚点设置两个点。让我们称它们为 p1
和 p2
。要计算与水平面的角度,我们需要第三个点。
如果我们角度的顶点是 p1
,这个新点将具有与 p1
相同的 y 坐标,但在 p2
的下方或上方。所以:
let p2Hor = vector_float3.init(p2.x, p1.y, p2.z)
要计算角度,我们需要从顶点 (p1
) 到每个点(p2
和 p2Hor
)的归一化向量及其点积。 vector_float3
和 simd
模块的那些操作相当容易。归一化向量计算如下:
let p1ToP2Norm = normalize(p2 - p1)
let p1ToP2HorNorm = normalize(p2Hor - p1)
点积:
let dotProduct = dot(p1ToP2Norm, p1ToP2HorNorm)
角度(弧度)为:
let angle = acos(dotProduct)
ARKit swift 中 vector_float3
的扩展中的所有这些:
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
}
}