Open5
HMDのレンズの歪み補正

立て付け

web上で見れる歪みのシミュレータ

Google Cardboardは糸巻き歪みに対応している
Cardboardはk1=0.441、k2=0.156らしい
新しい方はk1=0.34、k2=0.55
逆関数を使って、歪んだ後の位置から元にあるはずの位置を求めて、それをメッシュにしてるっぽい
この辺で本来の見え方のエリアをとってきてそう
cardboardの実装はここ

糸巻き歪みの補正(引用付き)
これを見てすべてを悟った

多分Secant法よりNewton法の方が収束が早い気がする
0<x<=1だし単調増加だし
let k1: Double = 0.34
let k2: Double = 0.55
let rd = newton(y: r) { x in
x + k1 * pow(x, 3) + k2 * pow(x, 5)
} derivative: { x in
1 + 3 * k1 * pow(x, 2) + 5 * k2 * pow(x, 4)
}
func newton(y: Double,
function f: (_ x: Double) -> Double,
derivative df: (_ x: Double) -> Double,
initialGuess: Double = 0.1,
tolerance: Double = 1e-10,
maxIterations: Int = 1000) -> Double? {
var x = initialGuess
for _ in 0..<maxIterations {
let f = f(x) - y
let df = df(x)
let deltaX = f / df
x -= deltaX
if abs(deltaX) < tolerance {
return x
}
}
return nil
}