2.5.2 三维图形的绘制
绘制3D图的方法并不复杂。以绘制曲面为例,首先创建一个二维矩阵
Make/O/N=(100,100)data SetScale/I x, -pi, pi, data SetScale/I x, -pi, pi, data data=sin(x)∗cos(y)
执行菜单命令【Windows】|【New】|【3 D Plots】|【Surface Plots】,打开3 D图形绘制对话框,如图2-89所示,其各项的含义与第2.4.7节介绍的相同。【Source】选择源数据的类型,这里选择Matrix wave。【Surface】下拉列表框选择要使用的原始数据,这里选择刚创建的data。【Surface Color】表示曲面的颜色,这里默认选择Rainbow,曲面的颜色由data矩阵中的数值大小决定,如果要修改,可以单击【Details】按钮。其他的选项选择默认设置。
图2-89 3D图形绘制对话框
单击【OK】按钮后结果如图2-90所示。左侧为显示3D图的Graph窗口,右侧为3D图绘制信息对话框。
图2-90 3D图及其绘制信息对话框
图2-90左侧的3D图可以自由旋转,按下并移动左键即可拖动视图。
【Gizmo Info】面板显示当前3D图的基本信息,如本例中3D图包含一个曲面surface0和一个坐标系axes0,这两个对象分别显示在【Gizmo Info】面板中【Display List】和【Obj ect List】属性列表中。surface0是3D图的名字。双击Surface0会弹出前面的Surface创建对话框,可以对Surface进行设置,如设置颜色、显示网格等。
【Gizmo Info】是3 D图形绘制的主要操作面板。除了通过菜单命令绘制3 D图之外,也可以通过【Gizmo Info】绘制3D图形,方法是单击【Object List】下三角形,选择【Append New Object】,然后选择要绘制的3D图形。根据选择类型不同会打开相应的对话框。
【Obj ect List】中的对象并不会显示,只有将【Obj ect List】列表中的对象拖入【Display List】才可以显示。Axes也是一个对象,表示坐标轴。
除了3D图对象、坐标轴对象之外,【Object List】列表还包括一些标准图形对象,如线、三角形、空间四边形、球体、柱体等,这些标准图形对象除了绘制特殊形状之外,也可以用来表示散点图或者空间图中的数据marker。注意,标准图形使用绘图区域相对坐标,绘图区域范围被定义为(-1,1),因此这些对象的坐标值应该小于这个数值。
除了基本的3D图形对象之外,【Display List】列表还包括对图像的操作,如图像变换、视角、颜色等对象。【Attribute List】列表列出属性对象,属性对象描述了3D图形的某些属性,如颜色、线宽、光照、光泽等。这些属性可以直接拖入【Display List】显示列表或者【Obj ect List】相应对象中,作为该对象属性之一,这些属性会影响3 D图形的最终显示效果。
【Gizmo Info】窗口可以通过NewGizmo/I命令打开。
特别地,在创建曲面时,数据源的类型一共包括9种,理解这些数据类型对掌握3D绘图非常有益,现将其含义介绍如下:
(1)Matrix wave:源数据是一个二维矩阵。
(2)Triangles wave:源数据是一个N×3的wave,每一行存放一组(x, y, z)坐标,每相邻三行表示一个三角形的3个顶点,曲面由这些三角形组成。在绘制等高面时,使用ModifyGizmo命令的savetowave属性可以生成等高面对应的Triangles wave。
(3)Volume wave:源数据是一个三维矩阵,此时曲面来源于源数据 z 方向的一层(plane)。
(4)Parametric wave:源数据是一个M×N×3的三维矩阵,按层存放x、y和z坐标。
(5)Quad wave:源数据是一个N×4×3的三维矩阵,表示曲面由一系列空间四边形组成,每一行的4列分别存放四边形的4个顶点,三层分别对应x、y和z坐标。
(6)Disj oint Qud wave:源数据是一个N× 12的二维矩阵,每一行存放一个空间四边形的4个顶点坐标。
(7)Volume Z Plane:源数据是一个三维矩阵,此时曲面数据来源于 z方向的一层(plane)。
(8)Volume X Plane和Volume Y Plane:和Volume Z Plane含义相同,只是曲面数据来源于x方向或者y 方向。
下面通过参数曲面创建一个球面。球面的参数方程如下:
创建参数曲面源数据的代码如下:
Make/O/N=(20,20,3)dsphere SetScale/I x,0, pi, dsphere SetScale/I y,0,2∗pi, dsphere dsphere[][][0]=1∗sin(x)∗cos(y) dsphere[][][1]=1∗sin(x)∗sin(y) dsphere[][][2]=1∗cos(x)
绘制曲面的代码如下,效果如图2-91所示。
NewGizmo/N=Gizmo0/T="Gizmo0" ModifyGizmo startRecMacro AppendToGizmo Surface=root:dsphere, name=surface0 ModifyGizmo ModifyObj ect=surface0 property={surfaceColorType,1} ModifyGizmoModifyObject=surface0 property={fillMode,3} ModifyGizmo ModifyObj ect=surface0 property={srcMode,4} ModifyGizmoModifyObject=surface0 property={frontColor,0.250004,0.996109,0.250004,1} ModifyGizmoModifyObject=surface0 property={backColor,0.996109,0.664073,0,1} ModifyGizmo setDisplayList=0, object=surface0 ModifyGizmo SETQUATERNION={0.488416,0.302182,0.455614,0.680110}
图2-91球形曲面绘制
读者也可以通过菜单来创建,但注意如果当前数据文件夹下仅有dsphere(即刚创建的数据)时,【Surface】菜单项不可用。此时可选择【Others】打开【Gizmo Info】面板,通过向【Obj ect List】添加【Surface】对象来创建上述曲面。同样,在命令行窗口输入NewGizmo/I也可以实现相同的操作。这里的操作留给读者作为练习。
在创建其他类型的3D图形时,数据类型已经确定,不能选择,如创建散点图,对话框只列出N×3的数据,看下面的例子:
Make/O/N=(20,3)data=gnoise(5)
data[][2]=2∗data[p][0]-3∗data[p][1]+data[p][0]∧2+gnoise(0.05)
执行菜单命令【Window】|【New】|【3D Plot】|【Scatter Plot】,打开散点图绘制对话框,如图2-92所示。
图2-92 散点图绘制对话框
散点图绘制对话框只列出满足条件的数据,如刚创建的data。【Marker Shape】里可以选择每一个散点对应的图形标记,如球体、立方体等。这些形状都是Igor预定义好的一些标准3D图形。还可以设置相应形状的颜色、旋转角度和大小等。
Voxelgram用于绘制真正的三维数据,这里的三维数据有3个坐标x、y和z,每一个数据点表示坐标为(x, y, z)处的数值。绘制时需要给数据点指定一个基本形状,或者将数据点显示为一个点。同时还要指定数值取某个值时数据点对应的颜色,Igor最多支持5个不同的颜色。
文献里经常会看到如图2-93所示类型的3D图,这里举例说明利用Igor绘制该类型图的方法(下面的方法适用于Igor 6.37及以前部分版本)。
图2-93 带有投影平面的3D图
首先创建一个wave:
Make/N=(100,100)/O data SetScale/I x, -2,2, data SetScale/I y, -2,2, data data=gauss(x, -1,0.5, y, -1,0.5)+gauss(x, -1,0.5, y,1,0.5) data=data+gauss(x,1,0.5, y, -1,0.5)+gauss(x,1, 0.5, y,1,0.5)
上述代码创建了名为data的wave,用于模拟类似电子态密度的分布。执行菜单命令【Windows】|【New】|【3D Plots】|【Surface Plot】,打开3D图形绘制对话框,按照图2-94设置。
图2-94 3D图形绘制对话框的设置
在【Surface】里选择data,然后按【OK】按钮,得到图2-95。
图2-95 3D Surface(曲面)图
图2-95也可以在数据浏览器中直接右击data,在弹出的快捷菜单里选择【Gizmo Plot】绘制。
使图2-95处于选择状态,执行【Gizmo】|【Axis Range】菜单命令,在弹出的对话框里设置坐标轴范围。这里设置z的最小值为-1,其他保持不变,此时数据显示在坐标系z方向靠上的部分,如图2-96所示。
图2-96 设置3D图的坐标范围
图的颜色不太正常,是由于颜色表默认第一个颜色对应刚设置的-1这个数值。将它改成正确的值就可以了,这里可设为0。双击图2-96的绘图区域(或者在【Gizmo Info】中双击surface0),在弹出的外观设置对话框里,单击【Surface Color】里【Detail】按钮,在弹出的对话框里设置选中【First Color at】复选框,并将其值设为0,如图2-97所示,显示效果如图2-98所示。
图2-97 3D图颜色方案设置
图2-98 修改颜色后的3D图
执行菜单命令【Gizmo】|【Append Contours】,打开如图2-99所示的对话框,按图设置,然后单击【Append Contour】按钮,给曲面添加Contour投影平面。
图2-99 给3D图添加Contour投影平面
关闭刚打开的对话框【Gizmo Contours】,在【Gizmo Info】窗口中,双击axes0对象,在弹出的对话框里设置X0、Y0和Z0坐标信息分别为Momentum、Momentum、Density, X0和Y0的【Center】值设置为-0.5, Z0的【Tilt】值设置为-90,注意一定要选中【Draw Axis Label】复选框,如图2-100所示。
图2-100 3D图坐标轴标签设置
最终效果就是本文前面提到的图2-93。利用同样的办法也可以将Contour换成Image,方法完全一样。
当一个3 D图形处于当前选择状态时,菜单栏里会出现一个【Gizmo】菜单。【Gizmo】菜单包含一些对3D图形操作的基本命令,如向当前窗口添加新的3D图、设置坐标轴范围等。【Gizmo】菜单里有一个【3D Slicer】的菜单项,可以打开一个简单的3D数据处理面板,通过此面板可以向当前窗口添加一个切面Image, Image可以是垂直x方向切取,也可以是垂直y方向或者z 方向切取,并且能自由拖动面板上滑块以显示不同的位置的切面。面板上各功能按钮描述得非常清楚,使用起来非常方便。
和其他的对话框一样,这里所有的操作也都最终被转化为相应的命令行。读者可以先利用菜单及对话框创建好相应的3D图,然后按Ctrl+Y键保存自动生成脚本(Recreation Macro)察看这些命令行。熟练以后,可以直接使用命令行创建3D图形。
通过执行菜单命令【Windows】|【New】|【3D Plots】|【3D Help】可以打开3D图绘制的帮助文件,里面有对Igor下3D图形绘制及其机理的详细介绍。通过执行菜单命令【Gizmo】|【Gizmo Help】也可以打开同样的帮助文件。3D图形绘制主要有7个命令和1个函数:AppendToGizmo、ExportGizmo、GetGizmo、GizmoMenu、ModifyGizmo、NewGizmo、RemoveFromGizmo、GizmoInfo。通过查询这些命令及函数的使用帮助也可以获取3D图形的帮助信息及其使用和设置方法。在命令行输入DisplayHelpTopic“Gizmo Reference”可以打开这些命令的帮助文档。
3D图形的绘制和显示还涉及其他一些概念,如坐标系统、投影、视角、变换、环境、光线、阴影、透明度、材质等,Igor支持这些特性,但使用起来较为复杂,完全掌握这些设置技巧需要对OpenGL 3D图形显示有较为深刻的理解。