【问题标题】:When to use worldTransform() and when to use transform() in ARKit在 ARKit 中何时使用 worldTransform() 以及何时使用 transform()
【发布时间】:2019-01-11 06:04:33
【问题描述】:

我一直在学习 ARKit,有两个基础知识可以根据对象的相对位置来转换对象。想知道何时使用transform() 方法和worldTransform() 方法,与示例有明显区别会很有用。

let transform = result.worldTransform
let isOnPlane = result.anchor is ARPlaneAnchor
object.setTransform(transform, relativeTo: cameraTransform,
                           smoothMovement: !isOnPlane,
                                alignment: planeAlignment,
                           allowAnimation: allowAnimation)

【问题讨论】:

    标签: ios swift matrix augmented-reality arkit


    【解决方案1】:

    1

    对于ARAnchorARCamera,使用local transform 实例属性。

    transform 是一个矩阵,用于编码锚点相对于锚点所在的 AR 会话的世界坐标空间的位置、方向和比例。

    例如,您可以很容易地得到 ARAnchor 或 ARCamera 的变换为 4x4 矩阵。

    var transform: simd_float4x4 { get }
    

    您应该以这种方式使用此变换属性(对于本地定位和定向的对象):

    var translation = matrix_identity_float4x4
    translation.columns.3.z = -0.25
    let transform = currentFrame.camera.transform * translation 
    
    // OR
    
    let transform = currentFrame.camera.transform
    let anchor = ARAnchor(transform: transform)                        
    sceneView.session.add(anchor: anchor)
    

    2

    对于hitTestResultsARAnchors,使用global worldTransform 实例属性。

    worldTransform是命中测试结果相对于世界坐标系的位置和方向。

    var worldTransform: simd_float4x4 { get }
    

    你可以这样使用它:

    if !hitTestResult.isEmpty {
    
        guard let hitResult = hitTestResult.first 
        else { return }
    
        addPlane(hitTestResult: hitResult)
        print(hitResult.worldTransform.columns.3)
    }
    
    // OR
    
    let anchor = ARAnchor(name: "PANTHER", transform: hitTestResult.worldTransform)
    sceneView.session.add(anchor: anchor)
    

    【讨论】:

    • 非常感谢您的解释,现在我明白了。
    猜你喜欢
    • 2019-10-15
    • 2014-01-16
    • 2015-09-06
    • 2021-05-31
    • 2016-02-11
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多