Какова правильная функция радиуса искажения ствола Oculus Rift?

Я хочу реализовать шейдер ствола для Oculus Rift в javascript.

согласно этому видео (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/

Почему оригинальная функция не работает??

Благодарность :)


person Cracker0dks    schedule 24.01.2015    source источник


Ответы (2)


Перепробовав много всего... я наконец нашел решение. Хитрость заключалась в том, чтобы сначала нормализовать 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/

Результат: введите здесь описание изображения

person Cracker0dks    schedule 25.01.2015

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.

Не то, чтобы это имело большое значение в данной ситуации, но все же вещь полезная.

person Witek    schedule 22.09.2015
comment
Ваше решение, похоже, дает неправильный эффект, как показано в вопросе ОП. Также: jsperf.com/testing-js-variable-declaration-speed - person Daedalus; 22.09.2015
comment
да приятно. Я тоже считаю это решение правильным. Это может показаться другим из-за добавленного масштабирования. Хорошая работа! - person Cracker0dks; 22.09.2015