Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我有3D空间中的点及其对应的2D图像点。如何在3D点之外制作网格,然后对由网格形成的三角形面进行纹理处理?
回答: 请注意,您最初尝试使用的函数trisurf返回了补丁对象的句柄。如果查看补丁对象的'FaceColor'属性 ,则可以看到没有'texturemap'选项。该选项仅对表面对象的'FaceColor'属性有效。因此,您将必须找到一种方法来绘制三角形表面作为表面对象而不是面 片对象。这有两种解决方法: 如果您的数据在统一网格中... 如果表面数据的坐标表示均匀的网格,则z是矩形点集,在x轴上跨度为xmin至xmax ,在y轴上跨度为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; ,使用内置的样本图像'peppers.png' ,并将x和y值设置为从1到16。这将导致以下纹理贴图表面: ![]() 如果您的数据间隔不均匀... 如果您的数据不是规则间隔的,则可以创建一组规则间隔的X和Y坐标(就像我在上面使用meshgrid所做的meshgrid ),然后使用函数griddata或TriScatteredInterp之一从不规则中插入Z值的规则网格z值集。我在回答另一个SO问题时讨论了如何使用这两个功能。这里是您发布使用代码的改良版本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 在这种情况下,必须首先为矩阵Z的大小选择N和M的值。为了说明上述代码的结果,我按如下所示初始化了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点TriScatteredInterp无法完全适合插值曲面。因此,这些点的Z值为nan ,导致未绘制表面点。 更多&回答... |
![]() |
![]() |