MATLAB中的纹理映射

时间:2010-03-21 18:00:16

标签: matlab plot interpolation texture-mapping geometry-surface

我在3D空间及其相应的2D图像点中有点。如何从3D点中制作网格,然后纹理网格形成的三角形面?

2 个答案:

答案 0 :(得分:5)

请注意,您最初尝试使用的函数trisurf会返回 patch 对象的句柄。如果您查看'FaceColor' property for patch objects,则可以看到没有'texturemap'选项。该选项仅对'FaceColor' property of surface objects有效。因此,您必须找到一种方法将三角形曲面绘制为曲面对象而不是补丁对象。以下是两种方法:

如果您的数据是统一网格......

如果曲面数据的坐标代表一个统一的网格,z是一组矩形的点,在x轴和{{1}之间从xminxmax。在y轴上转到ymin,您可以使用surf代替trisurf来绘制它:

ymax

为了说明上述代码的结果,我将数据初始化为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;,并设置'peppers.png'和{{1 }值跨越1到16.这导致以下纹理映射表面:

enter image description here

如果您的数据是非均匀间隔的......

如果您的数据没有规则间隔,您可以创建一组规则间隔的xy坐标(就像我上面使用meshgrid所做的那样),然后使用其中一个函数griddataTriScatteredInterp可以从不规则的X值集中插入Y值的常规网格。我将讨论如何在my answer to another SO question中使用这两个函数。以下是您使用Z发布的代码的精炼版本(注意:从R2013a开始scatteredInterpolant是推荐替代方案):

z

在这种情况下,您必须首先为矩阵TriScatteredInterp的大小选择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的值。为了说明上述代码的结果,我按如下方式初始化了MZx的数据,并使用了内置示例图像y

z

这导致以下纹理映射表面:

enter image description here

请注意,表面角落附近有锯齿状边缘。这些是'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 值为nan,导致表面点未被绘制。

答案 1 :(得分: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)形式的多个点。请注意,图像被拉伸以适合表面。