【问题标题】:what ist the correct Oculus Rift barrel distortion radius function?什么是正确的 Oculus Rift 桶形失真半径函数?
【发布时间】:2015-01-24 21:47:23
【问题描述】:

我想在 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 测试)

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

在这里你可以试一试:http://jsfiddle.net/s175ozts/2/

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

谢谢:)

【问题讨论】:

    标签: javascript image-processing filter distortion oculus


    【解决方案1】:

    在尝试了很多东西之后......我终于找到了解决方案。 诀窍是先对 r 进行归一化,然后将桶函数与原始 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
    

    在此处查看小提琴:http://jsfiddle.net/s175ozts/4/

    结果:

    【讨论】:

      【解决方案2】:

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

      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 临时数组。

      在这种情况下它并不重要,但它仍然是有用的东西。

      【讨论】:

      • 您的解决方案似乎给出了错误的效果,如 OP 的问题所示。另外:jsperf.com/testing-js-variable-declaration-speed
      • 是的,很好。我认为这个解决方案也是正确的。由于添加了缩放,它可能看起来不同。干得好!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多