一、将matlab的图窗制作为可以自动3D旋转变化的动图
1、保存图片窗口的多视角图片
最简单但也最复杂的方法就是手动旋转——图片另存为——保存,但1手动旋转有一定误差,制作动图后不一定好看;2视角越多工作量越大。
for ii=1:30
figure;pcshow(figureName); %画原图
set(0,'defaultfigurecolor','black'); %将窗口背景设置为黑色,'w'为白色
view(ii*10,30); %选择视角(方位角、俯仰角)
name=strcat('图片名',num2str(ii,'%02d'),'.bmp');
saveas(gcf,name);close; %无法保存窗口背景
%保存当前图窗与背景颜色
frame = getframe(gcf);
img = frame2im(frame);
imwrite(img,name);close;
end
2、制作动图
可以控制帧率,读取顺序决定动图展示的先后顺序。
del = 0.3; %动图帧时(秒)
for i=1:30
Fig = figure(1); %打开窗口
filename = 'saved.gif'; %定义gif动图名字
name=strcat('读取图片',num2str(i,'%02d'),'.bmp'); %读取需要制作成动图的图片,读取先后顺序决定动图展示的顺序
pic = imread(name);
imshow(pic); %在窗口展示图片
drawnow %窗口更新图片
%将窗口捕捉图片
frame = getframe(Fig);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
if i == 0
imwrite(imind,cm,filename,'gif','Loopcount',inf,'DelayTime',del);
else
imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',del);
end
end
工作到这儿其实就完了。但是接下来的任务变成了需要将该动图和其他静态图片放在一起合成一个大图片,且该图片需要动起来,我想过比较基础但是也比较复杂的方法就是将静态图片和动图所在的幻灯片复制N份,然后不停地将动图的位置分别替换为不同帧的图,最后再用PPT一键导出。但是就是复杂!麻烦!量大可能不好处理。所以打算继续用matlab:
3、插入静态图片
插入到其中一张幻灯片中,调整该静态图片的位置。
4、插入多视角图片
将多视角图片插入到不同幻灯片中一样的位置,和静态图片能够对应上。可以控制帧率,读取顺序决定动图展示的先后顺序。
% 在PPT中批量为多张幻灯片的相同位置插入图片,有一些函数没有完全明白,只是暂时拿来用了。
filename = '需要打开的PPT名字.pptx'; % ppt路径
g = actxserver('powerpoint.application');
g.Visible = 1; % 可视化
Presentation = g.Presentation;
Presentation = invoke(Presentation, 'open', filename);
for ii=1:30
name=strcat('插入图片图片',num2str(ii,'%02d'),'.bmp'); %需要插入的图片
slide_count = get(Presentation.Slides, 'Count'); % 读取当前ppt页数
slide_count = int32(double(slide_count)+1); % 选择下一页
slide = invoke(Presentation.Slides,'Add',slide_count,11); % 增加空白页
FiguesFilePath = name; % 图片路径
slide.Shapes.AddPicture(FiguesFilePath, 'msoFalse', 'msoTrue', 480,5,455,212);
% 原图大小插入固定位置(横坐标、竖、横大小、竖) 我自己用过的比例是设置图片长度300=PPT中的图片长度10.59 设置坐标5=PPT实际坐标0.18(左上角)
end
5、幻灯片母版合并
4中生成的多张幻灯片拥有一样的幻灯片母版,所以在该幻灯片母版上粘贴上1中幻灯片的静态图片。关闭幻灯片母版后就得到很多张静态图片和多视角图片结合的幻灯片。
6、PPT导出动图
文件——导出——创建动态GIF——设置需要结合的幻灯片范围和动图帧率——搞定。
探索方法确实花了挺长时间,但是当做完一张动图之后发现还要再做一张的时候,几分钟就弄好了,本次制作的动图不方便上传,等后面有时间会详细用图片。
二、三维结果画切面
注意:这个技能感觉很少用到,不太高级。咱就是说为了整点好看的图到处尝试,随便记录一下。
假设是对以下所示的立方体三维图像画切面。
1、图片+平面
最开始的想法是截图到PPT里,如下图,但是这样没有前后视觉上的区分。
2、增加前后视觉效果
如下图,用两个平行四边形分成两部分,分别放在三维图像这个图层的下面和上面,为了保证看着好看,可以从一个平行四边形通过调整渐变来得到两个刚好互补的形状。本来到这里没问题,但是如果这个切面不平行于底面或侧面,就比较考验美术功底,然后看着也少了点什么。
3、matlab一起画
如果在画出这个立方体的同时画平面,那么不管从哪个视角去看都好一些。所以可以线分别设置一些或平行或倾斜的平面,这里我随意设了几个,没有经过计算。
[xx,yy] = meshgrid(linspace(-30,30,80),linspace(-30,30,80));
tt = [xx(:),yy(:)];
zz1 = zeros(80,80);
zz2 = -(xx+yy)/4;
zz3 = ((linspace(-80,80,160).'*ones(1,80)).')/10;
用下面这个代码来画平面图。'color'的向量值前三是RGB,后一个是设置透明度,能控制透明度的好像只有线,线形可以改(不知道是不是因为点的性质,加上'.'或者'o'后会没有透明效果,如果后面找到方法了再来改)。
figure;plot3(tt(:,1),tt(:,2),zz1(:),'color',[0 0.4470 0.7410,0.2]);%'LineStyle',':'
hold on; plot3(tt(:,1),tt(:,2),zz2(:),'color',[0.9290 0.6940 0.1250,0.2]);
hold on; plot3(tt(:,1),tt(:,2),zz3(:),'color',[0.4660 0.6740 0.1880,0.2]);
hold on; pcshow(TargetsPos,'MarkerSize',60,'BackgroundColor',[1,1,1]);xlim([-20,20]);ylim([-20,20]);grid on; % 原三维点目标
下图就是按照自己设置的xyz画的三个平面,从各个角度看都还可以。
加上之前的立方体就可以了,当然这里颜色随便调,我这里整得有点花。视角变化随意,选择喜欢的角度就行。