実装メモ:Vision Pro の向いている仰角/伏角(pitch)を求める

Vision Pro 装着時の頭部が、水平に対して何度上下に向いているか(仰/伏角、ピッチ)を知るには、頭部(カメラ)方向のベクトルについて、XZ平面に射影したベクトル長とY軸方向の成分とで atan を計算すれば、その角度(ラジアン)が求まる。

カメラ方向ベクトルの求め方は、SATOSHI さんのサンプルコードを参照。

let worldTracking = WorldTrackingProvider()

fun headPitchRadian() -> CGFloat {
    let matrix = worldTracking.deviceOriginFromAnchorTransform!
    // カメラ前方方向
    let cameraForward = simd_act(matrix.rotation, simd_float3(0, 0, -1))
    let front = SIMD3<Float>(x: cameraForward.x, y: cameraForward.y, z: cameraForward.z)
    // XZ平面に射影したベクトル長
    let horizontalLen = simd_length(SIMD2<Float>(front.x, front.z))
    return CGFloat(atan2(front.y, horizontalLen))
}

ここで、worldTracking.deviceOriginFromAnchorTransform に対して [0, 0, 1] によりZ軸方向に反転させているのは、もともとデバイス正面がZ軸の負方向を向いているため。

カメラ方向ベクトルの算出は以下でもOK。

// columns.2 がデバイスZ軸方向のワールド座標系におけるベクトル
let zAxis = SIMD3<Float>(
    matrix.columns.2.x,
    matrix.columns.2.y,
    matrix.columns.2.z
)
let cameraForward = simd_normalize(-zAxis) // 反転

コメントを残す

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