返回顶部
首页 > 资讯 > 精选 >怎么用Matlab制作立体动态相册
  • 594
分享到

怎么用Matlab制作立体动态相册

2023-06-29 08:06:31 594人浏览 独家记忆
摘要

小编给大家分享一下怎么用Matlab制作立体动态相册,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!效果教程部分1 图片导入与大小重设需要有一个名为album的文件夹和当前m文件在同一文件夹,另外ablum文件夹内至少要有一

小编给大家分享一下怎么用Matlab制作立体动态相册,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

    效果

    怎么用Matlab制作立体动态相册

    怎么用Matlab制作立体动态相册

    教程部分

    1 图片导入与大小重设

    需要有一个名为album的文件夹和当前m文件在同一文件夹,另外ablum文件夹内至少要有一张jpg格式图片

    path='.\album\';%文件夹名称files=dir(fullfile(path,'*.jpg')); picNum=size(files,1);%遍历路径下每一幅图像for i=1:picNum   fileName=strcat(path,files(i).name);    img=imread(fileName);   img=imresize(img,[120,120]);   imgSet{i}=img;end

    我们注意到,这里用了一次imresize将突破变为120x120大小,这里重设大小有三个作用:

    • 将不是方形的图片变为方形

    • 将图像设置固定大小,方便构造网格放置图片

    • 120x120的大小大约是能让图片表示清晰为前提下最小的大小,图片太大的话运行会卡,太小的话不清晰

    2 fig axes设置

    % fig axes设置fig=figure('units','pixels','position',[50 50 600 600],...                       'Numbertitle','off','resize','off',...                       'name','album3D','menubar','none');ax=axes('parent',fig,'position',[-0.5 -0.5 2 2],...   'XLim', [-6 6],...   'YLim', [-6 6],...   'ZLim', [-6 6],...   'Visible','on',...   'XTick',[], ...   'YTick',[],...   'Color',[0 0 0],...   'DataAspectRatioMode','manual',...   'CameraPositionMode','manual');hold(ax,'on')

    大部分设置大家都能看懂,这里讲解一下一些比较少见的设置:

    1 为什么 axes的’position’属性不设置[0 0 1 1]?

    因为是3D坐标轴,设置为[0 0 1 1]后旋转起来效果是这样的,所以我们axes要设置的比figure大一圈:

    怎么用Matlab制作立体动态相册

    2 为什么要设置CameraPositionMode这一奇怪的属性?

    因为我们后期要频繁改变CameraPosition这一属性,而CameraPositionMode设置为manual可以让视角完全按照CameraPosition的数值来调整,至于为什么要调整视角呢?

    当然是因为如果对图像位置数据进行处理数据量会贼大,因此我们不妨直接转动axes视角而非转动图片。

    3 绘制图形句柄

    就是绘制小型立方体,中型立方体和大型立方体,其中鼠标移动到中型立方体中心时中型立方体变成大型立方体,这个可以靠设置图形对象的XData,YData,ZData数值来改变

    3.1 构造网格

    由于surf曲面图可以将图像贴在上面,还可以设置透明度,我们决定用surf函数来绘制,要贴图首先要将曲面绘制出来,就要先构造曲面网格:

    % 用于绘制图片的网格[XMesh,YMesh]=meshgrid(linspace(-1,1,120),linspace(-1,1,120));ZMesh=ones(120,120);

    3.2 绘制小型立方体

    % 绘制图片立方体surfPic(1)=surf(XMesh,YMesh,ZMesh,'CData',imgSet{mod(0,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(2)=surf(XMesh,YMesh(end:-1:1,:),-ZMesh,'CData',imgSet{mod(1,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(3)=surf(ZMesh,XMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(2,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(4)=surf(XMesh,ZMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(3,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(5)=surf(-ZMesh,XMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(4,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(6)=surf(XMesh,-ZMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(5,picNum)+1},'EdgeColor','none','FaceColor','interp');

    怎么用Matlab制作立体动态相册

    3.3 绘制中型立方体

    有了小型立方体,中型的绘制起来就简单了起来,甚至可以用一个for循环解决,只需要循环提取小型立方体的XData,YData,ZData数据后乘以1.5绘制图像,并设置透明度即可:

    % 依靠小立方体数据绘制中等立方体for i=1:6    surfPicA(i)=surf(surfPic(i).XData.*1.5,surfPic(i).YData.*1.5,surfPic(i).ZData.*1.5,...        'CData',surfPic(i).CData,'EdgeColor','none','FaceColor','interp','FaceAlpha',0.7);  end

    怎么用Matlab制作立体动态相册

    3.4 大型立方体参数设置

    大型立方体参数设置时就没那么简单,如果直接乘以2.5,图片与图片之间会没有缝隙,因此我们XData,YData,ZData数据虽然都要变大,但是要乘以不一样的数值,而且各个方向上乘的数值不同,因此我们可以事先设立一个矩阵,用来存储其参数:

    % 用来调整放大比例的矩阵resizeMat=[2 2 2.5;2 2 2.5;2.5 2 2;           2 2.5 2;2.5 2 2;2 2.5 2];

    想直接画大型正方形可以试试如下代码:

    % 最大图片绘制       % for i=1:6%     surfPicB(i)=surf(surfPic(i).XData.*resizeMat(i,1),...%                      surfPic(i).YData.*resizeMat(i,2),...%                      surfPic(i).ZData.*resizeMat(i,3),...%                      'CData',surfPic(i).CData,'EdgeColor',...%                      'none','FaceColor','interp','FaceAlpha',0.7);  % end

    4 立方体旋转

    我们只需要设置一个timer函数不断调整CameraPosition即可:

    fps=40;theta=0;rotateTimer=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @rotateCube);start(rotateTimer)    function rotateCube(~,~)        theta=theta+0.02;        ax.CameraPosition=[cos(theta)*5*sqrt(2),sin(theta)*5*sqrt(2),5];    end

    怎么用Matlab制作立体动态相册

    5 获取鼠标与中心点的距离

    本来想直接在timer调用的函数里写get(fig,‘CurrentPoint’);来获得鼠标当前位置的,但发现这样写只有鼠标点击窗口才会有反应,并不是鼠标移动就会有反应,因此我们再构造一个WindowButtonMotionFcn回调,!!!这一部分代码要写在上一步代码的前面!!!

    lastDis=300;preDis=300;set(fig,'WindowButtonMotionFcn',@move2center)        function move2center(~,~)        xy=get(fig,'CurrentPoint');        pRedis=sqrt(sum((xy-[300,300]).^2));    end

    preDis就是鼠标到图片中心的位置,我为什么要设置一个lastDis呢,因为每次移动鼠标都更新图像实在太卡了,因此我们要加一个判定,当且仅当以下两种情况更新图片大小

    • 之前鼠标距离中心>=150,现在<150

    • 之前鼠标距离中心<150,现在>=150

    6 鼠标移动到fig中心时更新图片

    将之前的rotateCube函数改成这样:

    function rotateCube(~,~)        theta=theta+0.02;        ax.CameraPosition=[cos(theta)*5*sqrt(2),sin(theta)*5*sqrt(2),5];        if (~all([preDis lastDis]<150))&&any([preDis lastDis]<150)            for ii=1:6                if preDis<150                    surfPicA(ii).XData=surfPic(ii).XData.*resizeMat(ii,1);                    surfPicA(ii).YData=surfPic(ii).YData.*resizeMat(ii,2);                    surfPicA(ii).ZData=surfPic(ii).ZData.*resizeMat(ii,3);                else                    surfPicA(ii).XData=surfPic(ii).XData.*1.5;                    surfPicA(ii).YData=surfPic(ii).YData.*1.5;                    surfPicA(ii).ZData=surfPic(ii).ZData.*1.5;                end            end        end        lastDis=preDis;    end

    其中:

    (~all([preDis lastDis]<150))&&any([preDis lastDis]<150)

    是用来判断上一次鼠标位置和当前鼠标位置是否只有一个距离中心<150

    另:

    for 循环中使用else来判断应该绘制大图片还是中等图片

    完整代码

    function album3dpath='.\album\';%文件夹名称files=dir(fullfile(path,'*.jpg')); picNum=size(files,1);%遍历路径下每一幅图像for i=1:picNum   fileName=strcat(path,files(i).name);    img=imread(fileName);   img=imresize(img,[120,120]);   imgSet{i}=img;end% fig axes设置fig=figure('units','pixels','position',[50 50 600 600],...                       'Numbertitle','off','resize','off',...                       'name','album3d','menubar','none');ax=axes('parent',fig,'position',[-0.5 -0.5 2 2],...   'XLim', [-6 6],...   'YLim', [-6 6],...   'ZLim', [-6 6],...   'Visible','on',...   'XTick',[], ...   'YTick',[],...   'Color',[0 0 0],...   'DataAspectRatioMode','manual',...   'CameraPositionMode','manual');hold(ax,'on')ax.CameraPosition=[5 5 5];% 用于绘制图片的网格[XMesh,YMesh]=meshgrid(linspace(-1,1,120),linspace(-1,1,120));ZMesh=ones(120,120);% 绘制图片立方体surfPic(1)=surf(XMesh,YMesh,ZMesh,'CData',imgSet{mod(0,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(2)=surf(XMesh,YMesh(end:-1:1,:),-ZMesh,'CData',imgSet{mod(1,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(3)=surf(ZMesh,XMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(2,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(4)=surf(XMesh,ZMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(3,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(5)=surf(-ZMesh,XMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(4,picNum)+1},'EdgeColor','none','FaceColor','interp');surfPic(6)=surf(XMesh,-ZMesh,YMesh(end:-1:1,:),'CData',imgSet{mod(5,picNum)+1},'EdgeColor','none','FaceColor','interp');% 依靠小立方体数据绘制中等立方体for i=1:6    surfPicA(i)=surf(surfPic(i).XData.*1.5,surfPic(i).YData.*1.5,surfPic(i).ZData.*1.5,...        'CData',surfPic(i).CData,'EdgeColor','none','FaceColor','interp','FaceAlpha',0.7);  end% 用来调整放大比例的矩阵resizeMat=[2 2 2.5;2 2 2.5;2.5 2 2;           2 2.5 2;2.5 2 2;2 2.5 2];% 最大图片绘制       % for i=1:6%     surfPicB(i)=surf(surfPic(i).XData.*resizeMat(i,1),...%                      surfPic(i).YData.*resizeMat(i,2),...%                      surfPic(i).ZData.*resizeMat(i,3),...%                      'CData',surfPic(i).CData,'EdgeColor',...%                      'none','FaceColor','interp','FaceAlpha',0.7);  % end     lastDis=300;preDis=300;set(fig,'WindowButtonMotionFcn',@move2center)        function move2center(~,~)        xy=get(fig,'CurrentPoint');        preDis=sqrt(sum((xy-[300,300]).^2));    endfps=40;theta=0;rotateTimer=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @rotateCube);start(rotateTimer)    function rotateCube(~,~)        theta=theta+0.02;        ax.CameraPosition=[cos(theta)*5*sqrt(2),sin(theta)*5*sqrt(2),5];        if (~all([preDis lastDis]<150))&&any([preDis lastDis]<150)            for ii=1:6                if preDis<150                    surfPicA(ii).XData=surfPic(ii).XData.*resizeMat(ii,1);                    surfPicA(ii).YData=surfPic(ii).YData.*resizeMat(ii,2);                    surfPicA(ii).ZData=surfPic(ii).ZData.*resizeMat(ii,3);                else                    surfPicA(ii).XData=surfPic(ii).XData.*1.5;                    surfPicA(ii).YData=surfPic(ii).YData.*1.5;                    surfPicA(ii).ZData=surfPic(ii).ZData.*1.5;                end            end        end        lastDis=preDis;    end% 弃用方案:太卡% set(fig,'WindowButtonMotionFcn',@move2center)    %     function move2center(~,~)%         xy=get(fig,'CurrentPoint');%         dis=sum((xy-[300,300]).^2);%         for ii=1:6%             if dis<200%                 surfPicA(ii).XData=surfPic(ii).XData.*resizeMat(ii,1);%                 surfPicA(ii).YData=surfPic(ii).YData.*resizeMat(ii,2);%                 surfPicA(ii).ZData=surfPic(ii).ZData.*resizeMat(ii,3);%             else%                 surfPicA(ii).XData=surfPic(ii).XData;%                 surfPicA(ii).YData=surfPic(ii).YData;%                 surfPicA(ii).ZData=surfPic(ii).ZData;%             end    %         end%         %         %         %     endend

    看完了这篇文章,相信你对“怎么用Matlab制作立体动态相册”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

    --结束END--

    本文标题: 怎么用Matlab制作立体动态相册

    本文链接: https://lsjlt.com/news/323705.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • 怎么用Matlab制作立体动态相册
      小编给大家分享一下怎么用Matlab制作立体动态相册,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!效果教程部分1 图片导入与大小重设需要有一个名为album的文件夹和当前m文件在同一文件夹,另外ablum文件夹内至少要有一...
      99+
      2023-06-29
    • 教你用Matlab制作立体动态相册
      目录效果教程部分1图片导入与大小重设2figaxes设置3绘制图形句柄4立方体旋转5获取鼠标与中心点的距离6鼠标移动到fig中心时更新图片完整代码效果 教程部分 1 图片导入与大...
      99+
      2024-04-02
    • 怎么用Matlab制作环形相册效果
      本篇内容主要讲解“怎么用Matlab制作环形相册效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Matlab制作环形相册效果”吧!运行效果完整步骤1.图片准备及导入要制作一款相册足够的图...
      99+
      2023-06-29
    • 如何使用html+css制作一个3D立体相册
      这篇文章主要介绍了如何使用html+css制作一个3D立体相册的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用html+css制作一个3D立体相册文章都会有所收获,下面我们一起来看看吧。一、先看效果二、实...
      99+
      2023-07-05
    • 利用Matlab制作环形相册效果详解
      目录运行效果完整步骤1.图片准备及导入2.为每张图片制作遮罩层3.调整每张图大小4.绘图及绘图参数详解完整代码运行效果 完整步骤 1.图片准备及导入 要制作一款相册足够的图片量是...
      99+
      2024-04-02
    • 用javascript制作qq注册动态页面
      目录一.前言1. 基础布局2. 自动切换图片3. 添加内容4. 自动缩放,控件的显示和隐藏5.响应用户输入操作一.前言 我们来看如何用html写一个注册页面并使用js加载用户输入响应...
      99+
      2024-04-02
    • 怎么使用CSS制作立体导航栏
      小编给大家分享一下怎么使用CSS制作立体导航栏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!css制作的立体导航栏,具体实现代码如下所示:<!doctype...
      99+
      2023-06-08
    • ps立体字效果怎么制作
      今天小编给大家分享一下ps立体字效果怎么制作的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先我们打开ps,新建一个画布。 ...
      99+
      2023-07-02
    • CSS3怎么制作三维相册效果
      这篇文章给大家分享的是有关CSS3怎么制作三维相册效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。XML/HTML Code复制内容到剪贴板<!DOCTYPE ...
      99+
      2024-04-02
    • 怎么用C++ OpenCV制作电子相册查看器
      这篇文章主要介绍“怎么用C++ OpenCV制作电子相册查看器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用C++ OpenCV制作电子相册查看器”文章能帮助大家解决问题。...
      99+
      2023-06-26
    • Matlab怎么实现动态表白图的绘制
      这篇文章主要介绍了Matlab怎么实现动态表白图的绘制的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Matlab怎么实现动态表白图的绘制文章都会有所收获,下面我们一起来看看吧。提前祝女朋友节日快乐1 展现这里没...
      99+
      2023-06-30
    • php动态网页怎么制作
      要制作一个动态网页,你可以使用PHP(Hypertext Preprocessor)编程语言。以下是制作动态网页的基本步骤:1. 安...
      99+
      2023-08-15
      php
    • 怎么用python绘制立体玫瑰花
      要使用Python绘制立体玫瑰花,可以使用matplotlib库和numpy库。下面是一个示例代码:```pythonimport ...
      99+
      2023-10-12
      python
    • 怎么用html制作一个动态烟花
      这篇文章主要介绍怎么用html制作一个动态烟花,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!   代码结构   1. HTML代码   var ctx = document.q...
      99+
      2024-04-02
    • Python怎么制作动态字符画
      本篇内容主要讲解“Python怎么制作动态字符画”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么制作动态字符画”吧!字符画,一种由字母、标点、汉字或其他字符组成的图画。简单的字符画...
      99+
      2023-06-20
    • PHP怎么制作动态计数器
      这篇文章主要介绍“PHP怎么制作动态计数器”,在日常操作中,相信很多人在PHP怎么制作动态计数器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP怎么制作动态计数器”的疑惑有所帮助!接下来,请跟着小编一起来...
      99+
      2023-06-17
    • 怎么用html+css+js制作动态千纸鹤
      本篇内容介绍了“怎么用html+css+js制作动态千纸鹤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
      99+
      2024-04-02
    • 怎么使用php和mysql制作动态网站
      要使用PHP和MySQL制作动态网站,您需要按照以下步骤进行操作:1. 安装PHP和MySQL:您需要在您的计算机上安装PHP和My...
      99+
      2023-08-23
      php mysql
    • 怎样用Python制作动态二维码
      这篇文章给大家介绍怎样用Python制作动态二维码,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何做到用一行代码实现动态二维码的制作?用法比较简单,直接通过pip安装即可pip3 install ...
      99+
      2023-06-02
    • html5怎么制作动漫动态背景图片
      这篇“html5怎么制作动漫动态背景图片”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ht...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作