matlab - MATLAB 中的纹理映射

标签 matlab plot interpolation texture-mapping geometry-surface

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

最佳答案

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

如果你的数据在一个统一的网格中...

如果您的表面数据坐标表示一个统一的网格,这样 z 是一组从 xminxmax 的矩形点在 x 轴和 yminymax 在 y 轴,您可以使用 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;,使用了内置的示例图片'peppers.png' , 并将 xy 值设置为从 1 到 16。这导致了以下纹理映射表面:

enter image description here

如果您的数据间隔不均匀...

如果您的数据不是规则间隔的,您可以创建一组规则间隔的 XY 坐标(就像我在上面使用 meshgrid 所做的那样),然后使用功能之一 griddataTriScatteredInterp从不规则的 z 值集中插入规则的 Z 值网格。我在 my answer to another SO question 中讨论了如何使用这两个函数。 .这是您使用 TriScatteredInterp 发布的代码的改进版本(注意:从 R2013a 开始,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

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

这导致了以下纹理贴图表面:

enter image description here

请注意,表面的角附近有锯齿状的边缘。这些地方的点太少,TriScatteredInterp 无法充分拟合插值表面。因此,这些点的 Z 值为 nan ,导致表面点未被绘制。

关于matlab - MATLAB 中的纹理映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2488086/

相关文章:

python - 当 x 数组的前 2 个值相同时,为什么 scipy 中的 interp1d 给出 NaN? (填充值 = 0)

python - 如何找到最接近网格值的点

matlab - 在 Matlab 中以精确的奈奎斯特速率采样

matlab - calcCovarMatrix 的问题

matlab - 有比这更好的矢量化技术吗?

r - 在R中,如何设置x轴的中断?

r - 如何在 r 中创建和弦图?

matlab - y = A *x + B 的多维线性回归

r - 带有ggplot2::stat_qq的Q-Q图,颜色,单个组

python - 给定分散的输入数据构建二维插值器