在3D体积数据中创建圆柱体

时间:2013-01-22 13:47:24

标签: matlab geometry volume-rendering

我正在尝试创建由几何形状组成的原始体积数据的数据集。关键是使用体积光线投射在2D中投影它们,但首先我想手动创建卷。

几何体由一个圆柱体组成,位于体积的中间,沿着Z轴,两个较小的圆柱体围绕第一个圆柱体,由围绕轴的旋转产生。

到目前为止,这是我的功能:

function cyl= createCylinders(a, b, c, rad1, h1, rad2, h2)

% a : data width
% b : data height
% c : data depth
% rad1: radius of the big center cylinder
% rad2: radius of the smaller cylinders
% h1: height of the big center cylinder
% h2: height of the smaller cylinders

[Y X Z] =meshgrid(1:a,1:b,1:c);  %matlab saves in a different order so X must be Y
centerX = a/2;
centerY = b/2;
centerZ = c/2;

theta = 0; %around y
fi = pi/4; %around x

% First cylinder
cyl = zeros(a,b,c);

% create for infinite height
R = sqrt((X-centerX).^2 + (Y-centerY).^2);

startZ = ceil(c/2) - floor(h1/2);
endZ = startZ + h1 - 1;

% then trim it to height = h1
temp = zeros(a,b,h1);
temp( R(:,:,startZ:endZ)<rad1 ) = 255;
cyl(:,:,startZ:endZ) = temp;

% Second cylinder

cyl2 = zeros(a,b,c);

A = (X-centerX)*cos(theta) + (Y-centerY)*sin(theta)*sin(fi) + (Z-centerZ)*cos(fi)*sin(theta);
B = (Y-centerY)*cos(fi) - (Z-centerZ)*sin(fi);

% create again for infinite height
R2 = sqrt(A.^2+B.^2);
cyl2(R2<rad2) = 255;

%then use 2 planes to trim outside of the limits
N = [ cos(fi)*sin(theta) -sin(fi) cos(fi)*cos(theta) ];

P = (rad2).*N + [ centerX centerY centerZ];
T = (X-P(1))*N(1) + (Y-P(2))*N(2) + (Z-P(3))*N(3);
cyl2(T<0) = 0;

P = (rad2+h2).*N + [ centerX centerY centerZ];
T = (X-P(1))*N(1) + (Y-P(2))*N(2) + (Z-P(3))*N(3);
cyl2(T>0) = 0;

% Third cylinder
% ...

cyl = cyl + cyl2;

cyl = uint8(round(cyl));

% ...

概念是创建第一个圆柱体,然后根据z轴值“切割”,以定义其高度。使用关系A 2 + B 2 = R 2 创建另一个圆柱体,其中A和B相应地使用旋转矩阵仅围绕x和y轴,使用R {sub> y (θ)R x (φ),如here所述。

到目前为止,一切似乎都在起作用,因为我已经实现了代码(测试它运作良好)来显示投影,并且当圆柱体没有从无限高度“修剪”时,它们似乎具有正确的旋转。

我计算N,它是矢量[0 0 1],也就是以与圆柱相同的方式旋转的z轴。然后我找到两个相同距离的P,我想要圆柱的边缘,并根据这些点和法向量计算平面方程T。最后,我根据这种平等进行修剪。或者至少那是我想的我正在做的事情,因为在修剪之后我通常不会得到任何东西(每个值都为零)。或者,在我进行实验时我能得到的最好的东西是圆柱修剪,但是顶部和底部的平面没有很好地定向。

我很感激我的代码提供任何帮助或更正,因为我一直在研究几何方程,但我无法找到错误的位置。

编辑: 这是我正在尝试创建的对象的快速屏幕截图。请注意,圆柱体数据中的圆柱体是不透明的,所有内部都被视为均质材料。

set of cylinders

1 个答案:

答案 0 :(得分:1)

我认为不是:

T = (X-P(1))*N(1) + (Y-P(2))*N(2) + (Z-P(3))*N(3);

你应该在两个地方尝试以下方法:

T = (X-P(1)) + (Y-P(2)) + (Z-P(3));

乘以N是为了说明您刚刚在该步骤上方完成的第二个气缸轴的方向。