我在3D空间及其相应的2D图像点中有点。如何从3D点中制作网格,然后纹理网格形成的三角形面?
答案 0 :(得分:5)
请注意,您最初尝试使用的函数trisurf
会返回 patch 对象的句柄。如果您查看'FaceColor'
property for patch objects,则可以看到没有'texturemap'
选项。该选项仅对'FaceColor'
property of surface objects有效。因此,您必须找到一种方法将三角形曲面绘制为曲面对象而不是补丁对象。以下是两种方法:
如果曲面数据的坐标代表一个统一的网格,z
是一组矩形的点,在x轴和{{1}之间从xmin
到xmax
。在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.这导致以下纹理映射表面:
如果您的数据没有规则间隔,您可以创建一组规则间隔的x
和y
坐标(就像我上面使用meshgrid
所做的那样),然后使用其中一个函数griddata
或TriScatteredInterp
可以从不规则的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
的值。为了说明上述代码的结果,我按如下方式初始化了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
值为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)形式的多个点。请注意,图像被拉伸以适合表面。