Как выполнить орфографическую проекцию изображения z-Buffer в Matlab?

Я столкнулся с той же проблемой, о которой упоминалось в этом посте, однако я столкнулся с ней не с OpenGL, а просто с MATLAB. Глубина как расстояние до плоскости камеры в GLSL

У меня есть изображение глубины, созданное из Z-буфера из 3ds max. Мне не удалось получить орфографическое представление z-буфера. Для лучшего понимания я буду использовать тот же скетч, что и в предыдущем посте:

   *          |--*
  /           |
 /            |
C-----*       C-----*
 \            |
  \           |
   *          |--* 

3 звездочки — это пиксели, а C — это камера. Линии от звездочек – это «глубина». В первом случае я получаю расстояние от пикселя до камеры. Во-вторых, я хочу получить расстояние от каждого пикселя до плоскости.

Настройки моей камеры следующие:

WIDTH = 512;
HEIGHT = 424;
FOV = 89.971;
aspect_ratio = WIDTH/HEIGHT;
%clipping planes
near = 500;
far = 5000;

Я рассчитываю параметры усеченной пирамиды следующим образом:

%calculate frustums settings
top = tan((FOV/2)*5000)
bottom = -top
right = top*aspect_ratio
left = -top*aspect_ratio

И установите матрицу проекции следующим образом:

%Generate matrix
O_p = [2/(right-left) 0 0 -((right+left)/(right-left)); ...
       0 2/(top-bottom) 0 -((top+bottom)/(top-bottom));...
       0 0 -2/(far-near) -(far+near)/(far-near);...
       0 0 0 1];

После этого я прочитал изображение глубины, которое было сохранено как 48-битное RGB-изображение, где все каналы одинаковы, поэтому должен использоваться только один канал.

%Read in image
img = imread('KinectImage.png');
%Throw away, except one channel (all hold the same information) 
c1 = img(:,:,1);

Значения пикселей необходимо инвертировать, так как чем ближе значения к камере, тем они ярче. Если пиксель равен 0 (объект для рендеринга недоступен), он устанавливается равным 2^16, поэтому после битового дополнения значение по-прежнему равно 0.

%Inverse bits that are not zero, so that the z-image has the correct values
c1(c1 == 0) = 2^16
c1_cmp = bitcmp(c1);

Чтобы применить матрицу к каждому значению z-буфера, я раскладываю одномерный вектор и строю такой вектор [0 0 z 1] над каждым элементом.

c1_cmp1d = squeeze(reshape(c1_cmp,[512*424,1]));
converted = double([zeros(WIDTH*HEIGHT,1) zeros(WIDTH*HEIGHT,1) c1_cmp1d zeros(WIDTH*HEIGHT,1)]) * double(O_p);

После этого я выбираю 4-й элемент результирующего вектора и преобразую его в изображение.

img_con = converted(:,4);
img_con = reshape(img_con,[424,512]);

Однако эффект того, что Z-буфер не является орфографическим, все еще присутствует, так что я ошибся? Мой расчет ошибочен? Или я ошибся здесь?

Изображение глубины из 3ds max введите здесь описание изображения

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

После вычисления (белый по-прежнему "0", но ось цвета изменилась) Было бы здорово добиться этого с помощью 3ds max, что решило бы эту проблему, однако я не смог найти эту настройку для z-буфера. . Таким образом, я хочу решить это с помощью Matlab.


person Kev1n91    schedule 04.10.2017    source источник