幾何学的形状で構成される生のボリューム データのデータセットを作成しようとしています。ポイントは、ボリューム レイ キャスティングを使用して 2D で投影することですが、最初にボリュームを手動で作成します。
ジオメトリは、ボリュームの中央にある Z 軸に沿った 1 つの円柱と、最初の円柱の周りにある 2 つの小さな円柱 (軸の周りの回転から派生) で構成されます。
これまでの私の機能は次のとおりです。
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 軸の値に従って「カット」され、その高さを定義するというものです。もう 1 つの円柱は、関係 A 2 + B 2 = R 2を使用して作成されます。ここで、A と B は、ここで説明されているように R y (θ)R x (φ)を使用して、x 軸と y 軸のみの回転行列を使用して適宜回転されます。
投影を表示するコードを実装し (うまく動作することをテストしました)、シリンダーが無限の高さから「トリミング」されていない場合、円柱は正しい回転をしているように見えるため、これまではすべてが機能しているようです。
円柱と同じように回転さN
せたベクトル、別名 z 軸を計算します。[0 0 1]
次に、円柱のエッジが必要な同じ距離の 2 つの点を見つけ、その点と法線ベクトルに従ってP
平面方程式を計算します。T
最後に、その等式に従ってトリムします。または、少なくともそれが私がやっていることだと思います。なぜなら、トリミングの後、私は通常何も得られないからです (すべての値はゼロです)。または、私が実験していたときに得られた最良のことは、円柱をトリミングしたことですが、上部と下部の平面の向きが適切ではありませんでした。
私は幾何学方程式を見ていて、間違いがどこにあるかを見つけることができないので、コードの助けや修正をいただければ幸いです。
編集:これは、作成しようとしているオブジェクトの簡単なスクリーンショットです。円柱はボリューム データでは不透明であることに注意してください。内部はすべて均質な材料と見なされます。