Constructing voxels of a 3D cube in MATLAB

前端 未结 1 519
攒了一身酷
攒了一身酷 2021-01-24 09:45

I want to construct a 3D cube in MATLAB. I know that the units of any 3D shape are voxels not pixels. Here is what I want to do,

First, I want to construct a cube with

相关标签:
1条回答
  • 2021-01-24 10:49

    You want to plot voxels! Good! Lets see how we can do this stuff.

    First of all: yeah, the unit of 3D shapes may be voxels, but they don't need to be. You can plot an sphere in 3D without it being "blocky", thus you dont need to describe it in term of voxels, the same way you don't need to describe a sinusoidal wave in term of pixels to be able to plot it on screen. Look at the figure below. (same happens for cubes)

    If you are interested in drawing voxels, I generally would recommend you to use vol3D v2 from Matlab's FEX. Why that instead of your own?

    Because the best (only?) way of plotting voxels is actually plotting flat square surfaces, 6 for each cube (see answer here for function that does that). This flat surfaces will also create some artifacts for something called z-fighting in computer graphics. vol3D actually only plots 3 surfaces, the ones looking at you, saving half of the computational time, and avoiding ugly plotting artifacts. It is easy to use, you can define colors per voxel and also the alpha (transparency) of each of them, allowing you to see inside.

    Example of use:

    % numbers are arbitrary
    cube=zeros(11,11,11);
    cube(3:9,3:9,3:9)=5; % Create a cube inside the region
    
    % Boring: faces of the cube are a different color.
    cube(3:9,3:9,3)=2;
    cube(3:9,3:9,9)=2;
    cube(3:9,3,3:9)=2;
    cube(3:9,9,3:9)=2;
    cube(3,3:9,3:9)=2;
    cube(9,3:9,3:9)=2;
    
    vold3d('Cdata',cube,'alpha',cube/5)
    

    But yeah, that still looks bad. Because if you want to see the inside, voxel plotting is not the best option. Alphas of different faces stack one on top of the other and the only way of solving this is writing advanced computer graphics ray tracing algorithms, and trust me, that's a long and tough road to take.

    Very often one has 4D data, thus data that contains 3D location and a single data for each of the locations. One may think that in this case, you really want voxels, as each of them have a 3D +color, 4D data. Indeed! you can do it with voxels, but sometimes its better to describe it in some other ways. As an example, lets see this person who wanted to highlight a region in his/hers 4D space (link). To see a bigger list I suggest you look at my answer in here about 4D visualization techniques.

    Lets try wits a different approach than the voxel one. Lets use the previous cube and create isosurfaces whenever the 4D data changes of value.

    iso1=isosurface(cube,1);
    iso2=isosurface(cube,4);
    p1=patch(iso1,'facecolor','r','facealpha',0.3,'linestyle','none');
    p2=patch(iso2,'facecolor','g','facealpha',1,'linestyle','none');
    
    % below here is code for it to look "fancy"
    isonormals(cube,p1)
    
    view(3); 
    axis tight
    axis equal
    axis off
    camlight 
    lighting gouraud
    

    And this one looks way better, in my opinion.

    Choose freely and good plotting!

    0 讨论(0)
提交回复
热议问题