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) // 反転