1

I am facing the same problem as mentioned in this post, however, I am not facing it with OpenGL, but simply with MATLAB. Depth as distance to camera plane in GLSL

I have a depth image rendered from the Z-Buffer from 3ds max. I was not able to get an orthographic representation of the z-buffer. For a better understanding, I will use the same sketch as made by the previous post:

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

The 3 asterisks are pixels and the C is the camera. The lines from the asterisks are the "depth". In the first case, I get the distance from the pixel to the camera. In the second, I wish to get the distance from each pixel to the plane.

The settins of my camera are the following:

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

I calulate the frustum settings like the following:

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

And set the projection matrix like this:

%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];

After this I read in the depth image, which was saved as a 48 bit RGB- image, where each channel is the same, thus only one channel has to be used.

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

The pixel values have to be inverted, since the closer the values are to the camera, the brigher they were. If a pixel is 0 (no object to render available) it is set to 2^16, so , that after the bit complementation, the value is still 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);

To apply the matrix, to each z-Buffer value, I lay out the vector one dimensional and build up a vector like this [0 0 z 1] , over every element.

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);

After that, I pick out the 4th element of the result vector and reshape it to a image

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

However, the effect, that the Z-Buffer is not orthographic is still there, so did I get sth wrong? Is my calculation flawed ? Or did I make mistake here?

Depth Image coming from 3ds max enter image description here

enter image description here

After the computation (the white is still "0" , but the color axis has changed) It would be great to achieve this with 3ds max, which would resolve this issue, however I was not able to find this setting for the z-buffer. Thus, I want to solve this using Matlab.

Kev1n91
  • 3,553
  • 8
  • 46
  • 96

0 Answers0