我想在MATLAB中构建一个立方体,并为其面部分配不同的2D图像。我认为这称为纹理映射。我搜索过这样的代码,但我发现的代码是能够将单个图像分配给所有立方体面的代码,这里的代码可用(http://www.mathworks.com/matlabcentral/answers/32070-rgb-images-on-a-3d-cube)。这是代码,
cdata = flipdim( imread('peppers.png'), 1 );
cdatar = flipdim( cdata, 2 );
% bottom
surface([-1 1; -1 1], [-1 -1; 1 1], [-1 -1; -1 -1], ...
'FaceColor', 'texturemap', 'CData', cdatar );
% top
surface([-1 1; -1 1], [-1 -1; 1 1], [1 1; 1 1], ...
'FaceColor', 'texturemap', 'CData', cdata );
% font
surface([-1 1; -1 1], [-1 -1; -1 -1], [-1 -1; 1 1], ...
'FaceColor', 'texturemap', 'CData', cdata );
% back
surface([-1 1; -1 1], [1 1; 1 1], [-1 -1; 1 1], ...
'FaceColor', 'texturemap', 'CData', cdatar );
% left
surface([-1 -1; -1 -1], [-1 1; -1 1], [-1 -1; 1 1], ...
'FaceColor', 'texturemap', 'CData', cdatar );
% right
surface([1 1; 1 1], [-1 1; -1 1], [-1 -1; 1 1], ...
'FaceColor', 'texturemap', 'CData', cdata );
view(3);
我想为不同的面部分配不同的图片,我试图将不同的cdata变量设置为cdata1,cdata2,...,cdata6每个都有不同的图像路径,但是我得到一个错误,表明cdata1是没有定义的。
编辑:以下是我仅使用2张图片作为示例的尝试,
cdata1 = flipdim( imread('face1.jpg'), 1 );
cdatar1 = flipdim( cdata1, 2 );
cdata2 = flipdim( imread('interface 1.png'), 1);
cdatar2 = flipdim( cdata2, 2 );
% bottom
surface([-1 1; -1 1], [-1 -1; 1 1], [-1 -1; -1 -1], ...
'FaceColor', 'texturemap', 'CData1', cdatar1 );
% top
surface([-1 1; -1 1], [-1 -1; 1 1], [1 1; 1 1], ...
'FaceColor', 'texturemap', 'CData2', cdata2 );
% font
surface([-1 1; -1 1], [-1 -1; -1 -1], [-1 -1; 1 1], ...
'FaceColor', 'texturemap', 'CData1', cdata1 );
% back
surface([-1 1; -1 1], [1 1; 1 1], [-1 -1; 1 1], ...
'FaceColor', 'texturemap', 'CData2', cdatar2 );
% left
surface([-1 -1; -1 -1], [-1 1; -1 1], [-1 -1; 1 1], ...
'FaceColor', 'texturemap', 'CData1', cdatar2 );
% right
surface([1 1; 1 1], [-1 1; -1 1], [-1 -1; 1 1], ...
'FaceColor', 'texturemap', 'CData1', cdata1 );
view(3);
上面的代码会产生错误,说明CData1未定义。
有人能告诉我如何让上面的代码能够将不同的图像分配给立方体的不同面吗?
感谢。
答案 0 :(得分:3)
应该很简单!
cdata1 = flipdim( imread('peppers.png'), 1 );
cdata2 = rgb2gray(flipdim( imread('peppers.png'), 1 ));
您似乎没有使用正确的名称创建变量(cdata1
,cdata2
,cdata3
,...)
另外:
您要在每个surface
调用中设置的属性名称不会更改。您总是希望将CData
设置为某些内容。表面上没有名为CData1
的属性,因为没有名为PutImageHere
的属性!将所有通话替换为'CData'
,如下所示:
surface([1 1; 1 1], [-1 1; -1 1], [-1 -1; 1 1], ...
'FaceColor', 'texturemap', 'CData', yourvariablename);
% in this case yourvariablename is cdata1