実装メモ:デバイス座標系における Entity の座標を求める

以下実装のために、デバイス座標系における Entity の座標を求める必要があった。

trackingMode = .continuous とした AnchorEntity(.head) の座標系に変換すれば簡単にできるかと思ったが、デバイス位置にアンカーがうまく追従されず、原因は分からなかったが先に進めたかったので、座標変換して求めることにした。

デバイス→ワールド座標系の変換行列 の逆行列をとれば、ワールド→ワールド座標系の変換行列となり、ワールド座標系における任意の座標をデバイス座標系に変換することができる。

let worldTracking = WorldTrackingProvider()

func positionInDeviceSpace(of entity: Entity) -> SIMD3<Float> {
    guard let deviceAnchor = worldTracking.queryDeviceAnchor(atTimestamp: CACurrentMediaTime()) else { return .zero }
    let worldFromDevice = deviceAnchor.originFromAnchorTransform
    let deviceFromWorld = worldFromDevice.inverse
    let worldFromEntity = entity.transformMatrix(relativeTo: nil)
    let deviceFromEntity = deviceFromWorld * worldFromEntity
    return SIMD3<Float>(
        deviceFromEntity.columns.3.x,
        deviceFromEntity.columns.3.y,
        deviceFromEntity.columns.3.z
    )
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です