3D 空間にポイントがあり、対応する 2D イメージ ポイントがあります。3D ポイントからメッシュを作成し、メッシュによって形成された三角形の面をテクスチャリングするにはどうすればよいですか?
2 に答える
最初に使用しようとしていた関数は、パッチオブジェクトtrisurf
へのハンドルを返すことに注意してください。パッチ オブジェクトのプロパティを見ると、オプションがないことがわかります。このオプションは、サーフェスオブジェクトのプロパティに対してのみ有効です。したがって、三角面をパッチオブジェクトではなく面オブジェクトとしてプロットする方法を見つける必要があります。これにアプローチするには、次の 2 つの方法があります。'FaceColor'
'texturemap'
'FaceColor'
データが均一なグリッドにある場合...
表面データの座標が、x 軸でから まで、y 軸で からまでz
の点の長方形のセットである均一なグリッドを表している場合は、代わりにを使用してプロットできます。xmin
xmax
ymin
ymax
surf
trisurf
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'
設定しました。これにより、次のようなテクスチャ マップ サーフェスが作成されました。x
y
データの間隔が不均一な場合...
データが等間隔でない場合は、等間隔のX
とY
座標のセットを作成し (上で を使用して行ったようにmeshgrid
)、関数の 1 つを使用するかgriddata
、不規則な値のセットから値TriScatteredInterp
の規則的なグリッドを補間します。別の SO question への回答で、これら 2 つの関数の使用方法について説明します。これは、投稿したコードの洗練されたバージョンです(注: R2013a の時点では、推奨される代替手段です)。Z
z
TriScatteredInterp
scatteredInterpolant
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
との値を選択する必要があります。上記のコードの結果を説明するために、 、、およびのデータを次のように初期化し、組み込みのサンプル イメージを使用しました。M
Z
x
y
z
'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
サーフェス ポイントはプロットされません。
テクスチャがすでに適切なジオメトリにある場合は、通常の古いテクスチャマッピングを使用できます。
テクスチャマッピングの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)の形式のいくつかの点を含む行列です。画像が表面に合うように引き伸ばされていることに注意してください。