使用MATLAB接口

本节包括以下内容:[大谦MATLAB,dqmatlab点com]

打开虚拟世界——打开一个虚拟世界并扫描它的结构。

与虚拟世界进行交互——为可以获取的虚拟世界节点和它们的字段设置新值。

关闭和删除vrworld对象——关闭打开的虚拟世界并将它们从内存中删除。

1.打开虚拟世界

通过打开虚拟世界,可以在VRML查看器中查看虚拟世界,扫描它的结构并从MATLAB命令窗口中改变虚拟世界的属性。

创建vrworld对象以后,可以用与该虚拟世界相连的vrworld对象打开虚拟世界。下面打开与虚拟世界vrmount.wrl相连的vrworld对象myworld。

(1)在MATLAB命令窗口输入

code.matlab
>> open(myworld);

MATLAB打开虚拟世界vrmount.wrl。

(2)输入

code.matlab
>> set(myworld, 'Description', 'My first virtual world');

描述属性变为“My first virtual world.”。这个描述显示在所有的虚拟现实对象列表中,显示在Simulink三维动画模块查看器的标题条中和Simulink三维动画模块HTML页上虚拟世界的列表中。

(3)打开Web浏览器。在域名窗口中输入

http://localhost:8123

浏览器通过用一个与“My first virtual world”的链接显示Simulink三维动画模块HTML页。如图4-1所示。数字8123是默认的Simulink三维动画模块端口号。该端口号可以改变。

Document Image

图4-1 用浏览器显示虚拟世界

如果该Web浏览器支持VRML和X3D,在浏览器窗口中单击“My first Virtual world.”。浏览器中将显示虚拟世界vrmount.wrl。在浏览器中打开该虚拟世界,如图4-2所示。

Document Image

图4-2 打开虚拟世界

另外,也可以用命令view(myworld)显示虚拟世界,它将虚拟场景显示在默认的查看器中。

2.与虚拟世界交互

可以用vrnode对象方法将所有可以获取的虚拟世界节点和它们的字段设置为新值。利用这个方法,可以在MATLAB环境中改变和控制虚拟世界的自由度。

vrworld类型的对象包含有多个节点,这些节点是vrnode类型的,在VRML文件中用DEF语句进行命名。

打开vrworld对象以后,就可以获取虚拟世界中可用的节点列表。下面利用vrworld对象myworld和虚拟世界vrmount.wrl进行演示。

(1)在MATLAB命令窗口输入

code.matlab
>> nodes(myworld);

MATLAB会显示vrnode对象及其字段的列表:

code.matlab
View1(Viewpoint) [My first virtual world]
Camera_car(Transform) [My first virtual world]
VPfollow(Viewpoint) [My first virtual world]
Automobile(Transform) [My first virtual world]
Wheel(Shape) [My first virtual world]
Tree1(Group) [My first virtual world]
Wood(Group) [My first virtual world]
Canal(Shape) [My first virtual world]
ElevApp(Appearance) [My first virtual world]
River(Shape) [My first virtual world]
Bridge(Shape) [My first virtual world]
Road(Shape) [My first virtual world]
Tunnel(Transform) [My first virtual world]

(2)输入

code.matlab
>> mynodes=get(myworld, 'Nodes')

MATLAB创建一个vrnode对象数组,这些对象对应于虚拟世界节点和显示。

code.matlab
mynodes=
    vrnode object: 13-by-1
    View1(Viewpoint) [My first virtual world]
    Camera_car(Transform) [My first virtual world]
    VPfollow(Viewpoint) [My first virtual world]
    Automobile(Transform) [My first virtual world]
    Wheel(Shape) [My first virtual world]
    Tree1(Group) [My first virtual world]
    Wood(Group) [My first virtual world]
    Canal(Shape) [My first virtual world]
    ElevApp(Appearance) [My first virtual world]
    River(Shape) [My first virtual world]
    Bridge(Shape) [My first virtual world]
    Road(Shape) [My first virtual world]
    Tunnel(Transform) [My first virtual world]

(3)输入

code.matlab
>> whos

MATLAB显示下面的信息:

code.matlab
Name          Size                   Bytes  	Class
  mynodes      13x1                 5592 		vrnode
  myworld       1x1                 184 		vrworld

现在可以获取节点特征并给某些节点属性设置新值了。例如,可以用“Automobile”改变汽车的位置,“Automobile”是虚拟世界中的第4个节点。

(4)输入下面的语句,取得Automobile节点的字段。

code.matlab
>> fields(mynodes(4));

或者输入

code.matlab
>> fields(myworld.Automobile)

MATLAB显示下面的列表:

code.matlab
Field                Access   TypeSync
    -----------------------------------------------------------
    translation          exposedFieldSFVec3foff
    center               exposedFieldSFVec3foff
    bboxCenter           field    SFVec3foff
    children             exposedFieldMFNodeoff
    scale                exposedFieldSFVec3foff
    bboxSize             field    SFVec3foff
    removeChildren       eventIn  MFNodeoff
    scaleOrientation     exposedFieldSFRotationoff
    rotation             exposedFieldSFRotationoff
    addChildren          eventIn  MFNodeoff

Automobile节点是Transform类型的。通过改变translation字段的值,可以改变该节点的位置。从上面的列表中,可以看出,translation字段需要3个值,分别表示对象的[x y z]坐标值。

(5)输入

code.matlab
>> view(myworld)

默认的查看器打开和显示虚拟世界vrmount.wrl,如图4-3所示。

Document Image

图4-3 打开和显示虚拟世界vrmount.wrl

(6)并排移动MATLAB窗口和浏览器窗口,这样可以同时查看它们。在MATLAB窗口中输入

code.matlab
>> myworld.Automobile.translation=[15 0.25 20];

MATLAB给Automobile节点设置一个新的位置,可以发现,在VRML浏览器窗口中,汽车到了一个新的位置。

3.关闭和删除vrworld对象

完成一个阶段的操作以后,必须关闭所有打开的虚拟世界并将它们从内存中删除。用下面的命令关闭和删除虚拟世界myworld。

code.matlab
>> close(myworld);
>> delete(myworld);

这样,表示vrworld对象myworld的虚拟世界就从内存中删除了。所有与查看器和浏览器可能的连接都会关闭,并且虚拟世界的名称也从可获取虚拟世界名称列表中删除了。但是注意,关闭和删除一个虚拟世界并不将该虚拟世界对象的句柄从MATLAB工作空间中删除。