两个ARAnchors之间的角度

时间:2017-11-07 14:14:05

标签: ios sprite-kit arkit

我正在尝试使用SpriteKit和ARKit,并想知道如何计算同一场景中两个ARAnchor之间的角度。

这意味着获取锚点在世界上的位置,并计算它们定义到水平面(或另一个任意平面)的线的角度。

由于

1 个答案:

答案 0 :(得分: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具有相同的y坐标,但在p2的正下方或上方。所以:

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

要计算角度,我们需要从顶点(p1)到每个点(p2p2Hor)及其点积的归一化向量。使用vector_float3simd模块的操作非常简单。归一化的向量计算如下:

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
    }
}
相关问题