什么是正确的 Oculus Rift 桶形畸变半径函数?

what ist the correct Oculus Rift barrel distortion radius function?

我想在 javascript 中为 oculus rift 实现桶形着色器。

根据此视频 (http://youtu.be/B7qrgrrHry0?t=11m26s),桶形畸变的半径函数为:

newr = 0.24*r^4+0.22*r^2+1

结果:

参考图像: 着色器之后:

如果我将函数更改为 newr = r,我会得到原始图像。


如果我将函数设置为:newr = 0.022*r^2 我得到:

这个很接近但不是正确的解决方案(用 oculus 测试)

所以这不是程序的错...问题是半径函数。

在这里你可以在 fiddle 中尝试:http://jsfiddle.net/s175ozts/2/

为什么原来的功能不起作用??

谢谢:)

在尝试了很多东西之后...我终于找到了解决方案。 诀窍是先对 r 进行归一化,然后将 barrelfunction 与原始 r

相乘
var sf = pr / rMax; //Scaling factor
var newR = pr*(0.24*Math.pow(sf,4)+0.22*Math.pow(sf,2)+1); //barrel distortion function

请参阅此处 fiddle:http://jsfiddle.net/s175ozts/4/

结果:

Cracker0dks@: 我在玩你的fiddle,并对其进行了显着优化:

http://jsfiddle.net/mqau9ytv/2/

/*int*/ var x_off = xmid-x;
/*int*/ var y_off = ymid-y;
/*int*/ var pr2 = x_off*x_off + y_off*y_off; //radius from pixel to pic mid, squared.
/*float*/ var sf2 = pr2 * rMax2_inv;  // Scaling factor squared.
/*float*/ var scale = zoom *(0.24*sf2*sf2 + 0.22*sf2 + 1.0); //barrel distortion function
/*float*/ var new_x_off = scale * x_off;
/*float*/ var newx = xmid - new_x_off;
/*float*/ var new_y_off = scale * y_off;
/*float*/ var newy = ymid - new_y_off;

它可能可以进一步优化,比如不实际生成一些变量,如 new_y_off,或 pix2D 临时数组。

在这种情况下它并不重要,但它仍然很有用。