Swift 如何在ARKit中获得相机的前向(注视)矢量?

Swift 如何在ARKit中获得相机的前向(注视)矢量?,swift,vector,camera,arkit,Swift,Vector,Camera,Arkit,我试图在ARKit中得到相机的前向(注视)矢量,但我想我搞错了什么 在做了一些研究之后,我在下面写了这个helper扩展,但是我认为从我得到的数据来看它是不对的。(当我将相机指向上时,Y分量为负数) 有人能告诉我,在获取摄像机指向世界空间的矢量时,我出了什么错吗?此外,如果有更好的方法获得它(CoreLocation?),我也愿意接受 extension ARCamera { /** The Camera forward orientation vector as vector_

我试图在ARKit中得到相机的前向(注视)矢量,但我想我搞错了什么

在做了一些研究之后,我在下面写了这个helper扩展,但是我认为从我得到的数据来看它是不对的。(当我将相机指向上时,Y分量为负数)

有人能告诉我,在获取摄像机指向世界空间的矢量时,我出了什么错吗?此外,如果有更好的方法获得它(CoreLocation?),我也愿意接受

extension ARCamera {
    /**
    The Camera forward orientation vector as vector_float3.
    */
    var forward: vector_float3 {
        get {
            return vector_float3(-1 * self.transform.columns.3.x,
                                 -1 * self.transform.columns.3.y,
                                 -1 * self.transform.columns.3.z)
        }
    }

    /**
    The Camera forward orientation vector as vector_float3 normalized.
    */
    var normalForward: vector_float3 {
        get {
            let theNormaled = simd_normalize(vector_float3(-1 * self.transform.columns.3.x,
                                                           -1 * self.transform.columns.3.y,
                                                           -1 * self.transform.columns.3.z))
            return theNormaled
        }
    }
}
提前谢谢


斯坦

我想我找到了一个更好的方法

我创建了一个RayCaskQualk,并只使用了在ARSCNVIEW中间的点作为原点。方向是光线投射结果的一个属性


这似乎仍然不是正确的方法,(我觉得我应该能够从相机的变换属性中提取前向向量,但这似乎有效。

我认为我找到了更好的方法

public extension float4x4 {

    var forwardVector: simd_float3 { simd_float3(columns.2.x, columns.2.y, columns.2.z).normalized() }

}


public extension simd_float3 {
    
    /**
     * Negates the vector described by simd_float3 and returns
     * the result as a new simd_float3.
     */
    func negate() -> simd_float3 {
        return self * -1
    }
    
    /**
     * Returns the length (magnitude) of the vector described by the simd_float3
     */
    func magnitude() -> Float {
        return sqrtf(x*x + y*y + z*z)
    }
    
    /**
     * Normalizes the vector described by the simd_float3 to length 1.0 and returns
     * the result as a new simd_float3.
     */
    public func normalized() -> simd_float3 {
        return self / magnitude()
    }
}
我创建了一个RayCaskQualo,只使用了在ARSCNVIEW中间的点作为原点。这个方向是光线投射结果的属性。

这似乎仍然不是正确的方法,(我觉得我应该能够从相机的变换属性中提取前向向量,但这似乎是可行的

public extension float4x4 {

    var forwardVector: simd_float3 { simd_float3(columns.2.x, columns.2.y, columns.2.z).normalized() }

}


public extension simd_float3 {
    
    /**
     * Negates the vector described by simd_float3 and returns
     * the result as a new simd_float3.
     */
    func negate() -> simd_float3 {
        return self * -1
    }
    
    /**
     * Returns the length (magnitude) of the vector described by the simd_float3
     */
    func magnitude() -> Float {
        return sqrtf(x*x + y*y + z*z)
    }
    
    /**
     * Normalizes the vector described by the simd_float3 to length 1.0 and returns
     * the result as a new simd_float3.
     */
    public func normalized() -> simd_float3 {
        return self / magnitude()
    }
}