SceneKit
Swift
swift4
ARKit

(ニッチ) iPhoneカメラの内部パラメーターの取得方法

結論

ものすごくニッチなんですが、iPhoneカメラの内部パラメーターを取得する方法。
公式ドキュメント がとてもわかりづらかったので。。。。

guard let currentFrame = sceneView.session.currentFrame else {
  print("Error: Current frame is nil. [\(#function)]")
  return
}

let intrinsics = currentFrame.camera.intrinsics
print(intrinsics)
//simd_float3x3([[1579.0884, 0.0, 0.0)], [0.0, 1579.0884, 0.0)], [942.4918, 712.6197, 1.0)]])

内部パラメーターについて

画像上の点をカメラからの位置情報に置き換えるためのパラメーターです。
基本的にはカメラに固有のものなんですが、焦点距離によって値が変わるので、iPhone等モバイルデバイスは使うなら毎回取得したほうが良いです。

スライド4-1.jpg
引用:内部パラメータの意味を解説してみる | NO MORE! 車輪の再発明

行列のパラメーターについて (雑談)

行列のパラメーターの割り振りは、日本語だと"行""列"の順番になるイメージですが、Appleは逆なんですね。

例えばSCNMatrix4で定義される、init(m11: Float, m12: Float, m13: Float, m14: Float, m21: Float, m22: Float, m23: Float, m24: Float,m31: Float, m32: Float, m33: Float, m34: Float,m41: Float, m42: Float, m43: Float, m44: Float)は、パッと見 m11,m12,m13,m14が1行目にありそうです。

ですが、これは数学的には下記と同値になります。(少しはまった)

\begin{matrix}
m11 & m21 & m31 & m41 \\
m12 & m22 & m32 & m42 \\
m13 & m23 & m33 & m43 \\
m14 & m24 & m34 & m44 \\
\end{matrix}

もしかしてこれが一般的なんでしょうか。。

Swiftについて(雑談)

いまさらSwift触って2ヶ月なんですが、言語としては無駄が少なくわかりやすいな〜と思うものの、ドキュメントに実装例ないのは厳しくないですか、、、

内部パラメーターの件も、いろんなクラスにまたがっててすぐにわからなかったです。。。個々では載ってるのですが。

参考:ARKitを使いつつカメラの制御がどこまでできるか調べてみた