如何使用纹理贴图绘制曲面

And*_*uri 4 matlab image-processing texture-mapping geometry-surface

我想绘制一个带有纹理贴图的表面,但条件不是"理想"的.

首先让我解释一下我的情况.

我有一组点(~7000),它们是网格中的图像坐标.这一点不能定义完美的正方形. 这不是一个MESHGRID.为了这个问题,我们假设我们有9分.让我们用图像说明我们所拥有的东西:

 X=[310,270,330,430,410,400,480,500,520]
 Y=[300,400,500,300,400,500,300,400,500]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 让我们说我们可以得到网格的"结构",所以

 size1=3;
 size2=3;
 points=zeros(size1,size2,2)
 X=[310,270,330;
    430,410,400;
    480,500,520]
 Y=[300,400,500;
    300,400,500;
    300,400,500]
 points(:,:,1)=X;
 points(:,:,2)=Y;
Run Code Online (Sandbox Code Playgroud)

现在我们假设我们有第三个维度Z.

编辑:如果信息忘了添加一块.我对图像中的点进行三角测量并获得3D对应关系,因此当在表面中显示时,它们没有图像的X和Y坐标,为了简化给定数据,可以说X = X/2 Y = Y/3

我们有:

 points=zeros(size1,size2,3)
 Z=[300,330,340;
    300,310,330;
    290,300,300]

 surf(points(:,:,1)/2,points(:,:,2)/3,points(:,:,3))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想要的是用图像纹理在3D中绘制表面.每个元素都应该具有第一个图像中的纹理片段.

这需要适用于大型数据表.我并不特别需要快速.

相关帖子(但我有一个网格网格作为初始点集):2D网格的纹理贴图

PD:如果需要,我可以发布原始图像+真实数据,只是发布了这个因为我认为使用小数据更容易.

H.M*_*ter 10

您可以使用适用于矩形网格以及非矩形网格的texturemap属性surf.

创建非矩形数据点

% creating non-rectangular data points
[X, Y] = meshgrid(1:100, 1:100);
X = X+rand(size(X))*5; 
Y = Y+rand(size(X))*5; 
Run Code Online (Sandbox Code Playgroud)

这导致以下数据点:

在此输入图像描述

生成高度数据:

Z = sin(X/max(X(:))*2*pi).*sin(Y/max(Y(:))*2*pi);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

载入图片:

[imageTest]=imread('peppers.png');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

并将其作为纹理映射到网格:

surf(X,Y,Z, imageTest, ...
     'edgecolor', 'none','FaceColor','texturemap')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,为了演示,这个非矩形网格非常稀疏,导致相当锯齿状的纹理.无论网格点的失真如何,使用更多的点,结果会更好.

另请注意,网格点的数量不必与纹理图像中的像素数相匹配.

〜编辑〜

如果X和Y坐标仅适用于图像的某些部分,则可以相应地调整纹理

minX = round(min(X(:)));
maxX = round(max(X(:))); 
minY = round(min(Y(:)));
maxY = round(max(Y(:)));

surf(X,Y,Z, imageTest(minX:maxX, minY:maxY, :), ...
     'edgecolor', 'none','FaceColor','texturemap')
Run Code Online (Sandbox Code Playgroud)