Из-за смещениялинзы относительно оптической оси системы нарушается радиальная симметрия, и картинка как бы съезжает, а так как мы работаем с оптикой и преломлением хода лучей, то еще и искривляется
Алгоритм:
То же, что и в прошлый раз, но в (2) мы не умножаем на коэффициент, а добавляем вектор, который считаем из текущих координат, расстояния до центра и коэффициентов.
Для тангенциальной:
static inline float2 tangential_distort(float2 uv, constant Parameters& params) {
// Fixed-point: xu_{n+1} = xu_n + (xd - distort_forward(xu_n))
float2 d = uv - params.center;
float2 scale = float2(params.aspect.x, params.aspect.y);
float2 xd = d * scale;
float x = xd.x, y = xd.y;
float r2 = dot(xd, xd);
float x2 = x*x, y2 = y*y, xy = x*y;
float2 tang = float2(2.0 * params.p1 * xy + params.p2 * (r2 + 2.0 * x2),
params.p1 * (r2 + 2.0 * y2) + 2.0*params.p2 * xy);
float2 xu = xd - tang;
return params.center + xu / scale;
}
https://www.desmos.com/3d/urwkdxvkoi