10

3D 空間にポイントがあり、対応する 2D イメージ ポイントがあります。3D ポイントからメッシュを作成し、メッシュによって形成された三角形の面をテクスチャリングするにはどうすればよいですか?

4

2 に答える 2

5

最初に使用しようとしていた関数は、パッチオブジェクトtrisurfへのハンドルを返すことに注意してください。パッチ オブジェクトのプロパティを見ると、オプションがないことがわかります。このオプションは、サーフェスオブジェクトのプロパティに対してのみ有効です。したがって、三角面をパッチオブジェクトではなくオブジェクトとしてプロットする方法を見つける必要があります。これにアプローチするには、次の 2 つの方法があります。'FaceColor''texturemap''FaceColor'

データが均一なグリッドにある場合...

表面データの座標が、x 軸でから まで、y 軸で からまでzの点の長方形のセットである均一なグリッドを表している場合は、代わりにを使用してプロットできます。xminxmaxyminymaxsurftrisurf

Z = ...  % N-by-M matrix of data
x = linspace(xmin, xmax, size(Z, 2));  % x-coordinates for columns of Z
y = linspace(ymin, ymax, size(Z, 1));  % y-coordinates for rows of Z
[X, Y] = meshgrid(x, y);               % Create meshes for x and y
C = imread('image1.jpg');              % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ...   % Plot surface (flips rows of C, if needed)
         'FaceColor', 'texturemap', ...
         'EdgeColor', 'none');
axis equal

上記のコードの結果を説明するために、データを として初期化しZ = peaks;、組み込みのサンプル イメージを使用し、との値を 1 ~ 16 の範囲に'peppers.png'設定しました。これにより、次のようなテクスチャ マップ サーフェスが作成されました。xy

ここに画像の説明を入力

データの間隔が不均一な場合...

データが等間隔でない場合は、等間隔のXY座標のセットを作成し (上で を使用して行ったようにmeshgrid)、関数の 1 つを使用するかgriddata、不規則な値のセットから値TriScatteredInterpの規則的なグリッドを補間します。別の SO question への回答で、これら 2 つの関数の使用方法について説明します。これは、投稿したコードの洗練されたバージョンです(注: R2013a の時点では、推奨される代替手段です)。ZzTriScatteredInterpscatteredInterpolant

x = ...  % Scattered x data
y = ...  % Scattered y data
z = ...  % Scattered z data
xmin = min(x);
xmax = max(x);
ymin = min(y);
ymax = max(y);
F = TriScatteredInterp(x(:), y(:), z(:));  % Create interpolant
N = 50;  % Number of y values in uniform grid
M = 50;  % Number of x values in uniform grid
xu = linspace(xmin, xmax, M);         % Uniform x-coordinates
yu = linspace(ymin, ymax, N);         % Uniform y-coordinates
[X, Y] = meshgrid(xu, yu);            % Create meshes for xu and yu
Z = F(X, Y);                          % Evaluate interpolant (N-by-M matrix)
C = imread('image1.jpg');             % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ...  % Plot surface
         'FaceColor', 'texturemap', ...
         'EdgeColor', 'none');
axis equal

この場合、まず行列のサイズのNとの値を選択する必要があります。上記のコードの結果を説明するために、 、、およびのデータを次のように初期化し、組み込みのサンプル イメージを使用しました。MZxyz'peppers.png'

x = rand(1, 100)-0.5;  % 100 random values in the range -0.5 to 0.5
y = rand(1, 100)-0.5;  % 100 random values in the range -0.5 to 0.5
z = exp(-(x.^2+y.^2)./0.125);  % Values from a 2-D Gaussian distribution

これにより、次のテクスチャ マップ サーフェスが作成されました。

ここに画像の説明を入力

サーフェスのコーナー近くにギザギザのエッジがあることに注意してください。TriScatteredInterpこれらは、補間されたサーフェスに適切にフィットするにはポイントが少なすぎる場所です。Zしたがって、これらのポイントの値は であり、nanサーフェス ポイントはプロットされません。

于 2010-03-21T20:37:04.243 に答える
1

テクスチャがすでに適切なジオメトリにある場合は、通常の古いテクスチャマッピングを使用できます。

テクスチャマッピングのMathWorksドキュメントへのリンク:http: //www.mathworks.com/access/helpdesk/help/techdoc/visualize/f0-18164.html#f0-9250

再編集:コードを少し更新しました:

このアプローチを試してください(私はそれを機能させました)。

 a=imread('image.jpg');
 b=double(a)/255;

 [x,y,z]=peaks(30);  %# This is a surface maker that you do have
                     %# The matrix [x,y,z] is the representation of the surface.

 surf(x,y,z,b,'FaceColor','texturemap')  %# Try this with any image and you 
                                         %# should see a pretty explanatory 
                                         %# result. (Just copy and paste) ;)

したがって、[x、y、z]は「表面」であり、表面上にある(x、y、z)の形式のいくつかの点を含む行列です。画像が表面に合うように引き伸ばされていることに注意してください。

于 2010-03-21T18:31:07.513 に答える