点群を構築した後、各点の法線を取得したいので、組み込みの matlab 関数 surfnorm を使用しましたが、処理に時間がかかります。したがって、誰かが私を助けてくれれば、これをより効果的で効率的な方法で行うことができます。
1685 次
1 に答える
3
次のコードが役立つかどうか疑問に思います。ここには 3 つのステップがあります。
- 500 個のランダムな間隔の点 (x,y) を作成し、
sinc
同様の関数を選択した対応する値 z (表面の高さ) を計算します。 - 関数を使用してランダムなポイントを再
TriScatteredInterp
サンプリングします。これにより、最初のサーフェスに「ほぼ対応する」均等にサンプリングされたグリッド上のポイントを取得できます。 - そのグリッドの「いくつかのポイント」の法線を計算します (480x640 ポイントがあるため、すべてのポイントで法線を計算すると、信じられないほど密集した「ベクトルの森」が作成されます。「10 番目のポイントごと」にサンプリングすることで、実際に自分が何であるかを確認できます。やっている
私が使用したコードは次のとおりです。
randomX = rand(1,500);
randomY = rand(1,500);
r = 5*sqrt(randomX.^2 + randomY.^2);
randomZ = sin(r) ./ r;
% resample the data:
[xx yy] = meshgrid(linspace(0,1,640), linspace(0,1,480));
F = TriScatteredInterp(randomX(:), randomY(:), randomZ(:));
zz = F(xx, yy);
%% at each point, the normal is cross product of vectors to neighbors
xyz=reshape([xx yy zz],[size(xx) 3]);
xv = 10:30:479; yv = 10:30:639; % points at which to compute normals
dx = xyz(xv, yv+1, :) - xyz(xv, yv, :);
dy = xyz(xv+1, yv, :) - xyz(xv, yv, :);
normVecs = cross(dx, dy); % here we compute the normals.
normVecs = normVecs ./ repmat(sqrt(sum(normVecs.^2, 3)), [1 1 3]);
figure;
quiver3(xx(xv, yv), yy(xv, yv), zz(xv, yv), ...
normVecs(:,:,1), normVecs(:,:,2), normVecs(:,:,3));
axis equal
view([56 22]);
そして結果のプロット:
于 2013-08-05T18:39:39.077 に答える