什么是正确的 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 临时数组。
在这种情况下它并不重要,但它仍然很有用。
我想在 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
我得到:
所以这不是程序的错...问题是半径函数。
在这里你可以在 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 临时数组。
在这种情况下它并不重要,但它仍然很有用。