【MATLAB 从零到进阶】day7制作三维图形

2019-04-10 15:43:18 浏览数 (3)

第三节 三维图形绘制

用plot3函数绘制三维螺旋线

>> t = linspace(0, 10*pi, 300);

>> plot3(20*sin(t), 20*cos(t), t, 'r', 'linewidth', 2);

>> hold on %图形保持

>> quiver3(0,0,0,1,0,0,25,'k','filled','LineWidth',2);

>> quiver3(0,0,0,0,1,0,25,'k','filled','LineWidth',2);

>> quiver3(0,0,0,0,0,1,40,'k','filled','LineWidth',2);

>> grid on

>> xlabel('X'); ylabel('Y'); zlabel('Z');

>> axis([-25 25 -25 25 0 40]);

>> view(-210,30);

>> [x,y]=meshgrid(0:0.25:4*pi);

>> z=sin(x sin(y))-x/10; mesh(x,y,z);

>> axis([0 4*pi 0 4*pi -2.5 1]);

调用函数绘制柱面,球面,椭球面

% 绘制圆柱面 >> subplot(2,2,1); >> [x,y,z] = cylinder; >> surf(x,y,z); % 绘制哑铃面 >> subplot(2,2,2); >> t = 0:pi/10:2*pi; >> [X,Y,Z] = cylinder(2 cos(t)); >> surf(X,Y,Z); % 绘制球面,半径为10,球心(1,1,1) >> subplot(2,2,3); >> [x,y,z] = sphere; >> surf(10*x 1,10*y 1,10*z 1); axis equal; % 绘制椭球面 >> subplot(2,2,4); >> a=4; b=3; >> t = -b:b/10:b; >> [x,y,z] = cylinder(a*sqrt(1-t.^2/b^2),30); >> surf(x,y,z);

绘制三维饼图、三维柱状图、三维火柴杆图、三维填充图、三维向量场图和立体切片图(四维图).

% 饼图 >> subplot(2,3,1); >> pie3([2347,1827,2043,3025]); >> title('三维饼图'); % 柱状图 >> subplot(2,3,2); >> bar3(magic(4)); >> title('三维柱状图'); % 火柴杆图 >> subplot(2,3,3); >> y=2*sin(0:pi/10:2*pi); >> stem3(y); >> title('三维火柴杆图'); % 填充图 >> subplot(2,3,4); >> fill3(rand(3,5),rand(3,5),rand(3,5), 'y' ); >> title('三维填充图'); >> subplot(2,3,5); >> [X,Y] = meshgrid(0:0.25:4,-2:0.25:2); >> Z = sin(X).*cos(Y); >> [Nx,Ny,Nz] = surfnorm(X,Y,Z); >> surf(X,Y,Z); >> hold on; > quiver3(X,Y,Z,Nx,Ny,Nz,0.5); >> title('三维向量场图'); >> axis([0 4 -2 2 -1 1]); % 立体切片图(四维图) >> subplot(2,3,6); >> t = linspace(-2,2,20); >> [X,Y,Z] = meshgrid(t,t,t); >> V = X.*exp(-X.^2-Y.^2-Z.^2); >> xslice = [-1.2,.8,2]; >> yslice = 2; >> zslice = [-2,0]; >> slice(X,Y,Z,V,xslice,yslice,zslice); >> title('立体切片图(四维图)');

二、三维图形的修饰和添加注释

MATLAB中提供了colormap函数,可以根据颜色映像矩阵对图形对象的色彩进行调整。所谓的颜色映像矩阵就是一个的矩阵,k行表示有k种颜色,每行3个元素分别代表红、绿、蓝三元色的灰度值,取值均在[0,1]之间。

colormap 函数

colormap(map),设置map为当前颜色映像矩阵

colormap('default'),恢复当前颜色映像矩阵为默认值

cmap = colormap,获取当前颜色映像矩阵

colormap(ax,…),设置当前axes对象的颜色映像矩阵

map的设置有两种,可以人为指定一个元素值均在[0,1]之间的的矩阵,也可以用MATLAB自带的17种颜色映像矩阵。在MATLAB命令窗口分别运行autumn、bone、colorcube、cool、copper、flag、gray、hot、hsv、jet、lines、pink、prism、spring、summer、white和winter函数,就可得到这17种颜色映

三维图形的透视效果

subplot(1,2,1); [X,Y,Z] = sphere; surf(X,Y,Z); colormap(lines); shading interp hold on; mesh(2*X,2*Y,2*Z) hidden off axis equal axis off subplot(1,2,2); surf(X,Y,Z,'FaceColor','r'); hold on; surf(2*X,2*Y,2*Z,'FaceAlpha',0.4); axis equal axis off

4. 光源设置与属性调整

light函数

light('PropertyName',propertyvalue,…)

建立一个光源,并设置光源属性(Position、Color和Style)'Position'是位置属性,设置光源位置,其属性值为三个元素的向量[x, y, z],即光源的三维坐标;'Color'是颜色属性,设置光源颜色,其属性值可以是代表颜色的字符(如表5.2-1所列),也可以是由红、绿、蓝三元色的灰度值组成的向量;'Style'是光源类型属性,设置光源类型,其取值为字符串'infinite' 或'local',分别表示平行光源和点光源。

handle = light(…)

建立一个光源,并获取其句柄值handle,之后可以通过get(handle)查看光源的所有属性,也可以通过set(handle, 'PropertyName',propertyvalue,…)设置光源的属性值。

5. 调整光照模式

lighting函数

lighting flat,产生均匀光照,选择此方法,以查看面对象,是光照模式的默认设置。

lighting gouraud,计算顶点法线并作线性插值修改表面颜色,选择此方法,以查看曲面对象。

lighting phong,做线性插值并计算每个像素的反射率来修改表面颜色,选择此方法,以查看曲面对象。此方法比lighting gouraud的效果好,但是用于渲染的时间较长。

lighting none,关掉照明。

6. 图形表面对光照反射属性设置

material函数

material shiny,使图形对象有相对较高的镜面反射,镜面光的颜色仅取决于光源颜色。

material dull,使图形对象有更多的漫反射,反射光的颜色仅取决于光源颜色。

material metal,使图形对象有非常高的镜面反射和非常低的环境光及漫反射,反射光的颜色取决于光源颜色和图形表面的颜色。

material([ka kd ks])

material([ka kd ks n])

material([ka kd ks n sc]),用ka、kd和ks分别设置图形对象的环境光、漫反射和镜面反射的强度,用镜面指数n控制镜面亮点的大小,用sc设置镜面颜色的反射系数。ka、kd、ks、n和sc均为标量,sc的取值介于0和1之间。

material default,恢复ka、kd、ks、n和sc的默认值。

7. 调整视点位置

view函数

view(az,el),设置三维绘图的视角, az是方位角,el表示相对于xoy平面的仰角,。

view([x,y,z]),设置视点的三维直角坐标[x, y, z].

view(2),设置默认的二维视角,az = 0, el = 90.

view(3),设置默认的三维视角,az = -37.5, el = 30.

view(ax,…),设置句柄值为ax的坐标系的视角。

view(T),用viewmtx函数生成的的视角转换矩阵作为输入来设置视角。

[az,el] = view,返回当前方向角和仰角。

T = view,返回一个的视角转换矩阵。

绘制一个透明的立方体盒子,里面放红色、蓝色和黄色三个球。

vert = [0 0 0;0 200 0;200 200 0;200 0 0;0 0 100;... 0 200 100;200 200 100;200 0 100]; fac = [1 2 3 4;2 6 7 3;4 3 7 8;1 5 8 4;1 2 6 5;5 6 7 8]; view(3); h = patch('faces',fac,'vertices',vert,'FaceColor','g'); set(h,'FaceAlpha',0.25); hold on; [x0,y0,z0] = sphere; x = 30 30*x0; y = 50 30*y0; z = 50 30*z0; h1 = surf(x,y,z,'linestyle','none','FaceColor','r','EdgeColor','none'); x = 110 30*x0; y = 110 30*y0; z = 50 30*z0; h2 = surf(x,y,z,'linestyle','none','FaceColor','b','EdgeColor','none'); x = 110 30*x0; y = 30 30*y0; z = 50 30*z0; h3 = surf(x,y,z,'linestyle','none','FaceColor','y','EdgeColor','none'); lightangle(45,30); lighting phong; axis equal; xlabel('X'); ylabel('Y'); zlabel('Z');

0 人点赞