VRMLTest - 完整的 VRML 1.x 解析器和部分查看器






4.58/5 (9投票s)
2000年2月7日

132137

7418
VRML 解析器和部分查看器
![]() |
![]() |
本文介绍
-
CVRMLScene
一个“场景图”以及所有相关的类,包括一个完整的 VRML 1.x 解析器。 -
COGLCanvas
我自己的 YAOWM(另一个用于 MFC 的 OpenGL 包装器);)). -
CVRMLCanvas
COGLCanvas
的子类,一个使用 OpenGL 渲染有限集 VRML 原始对象的示例应用程序。可以在 http://www.rosl.com 免费下载此画布支持的模型示例(我与该网站无关,至少目前还没有)。;))。.wrl 文件包含在 .zip 文件中,来自该 URL(除了allnodes.wrl
)。 -
vrmltest
,所有上述内容的示例应用程序,您可以在顶部看到其屏幕截图。
目录
简介
我正在开发一个用于工业机器人编程的 CAD 类环境和调试器,作为我五年计算机科学学位的最终项目。它需要在一定程度上模仿 Robotech's Workspace。它需要的功能之一是加载机器人的 VRML 模型,因此有了这个代码。本文远非详尽,但您可以查看所有类的 文档,这些文档是使用 Eric Artzt 的 _Autoduck_(一个代码内文档工具)从代码中自动生成的(这就是为什么您在代码中看到奇怪的注释)。我计划有一天(或另一个)发布一篇关于此自动文档工具的文章。
完整的 VRML 1.x 解析器
我不会对这个解析器说太多,只是我对它感到非常自豪。:*).主类是 CVRMLScene
,它包含 VRML 文件解析和加载功能。所有其他类都定义了遍历构建的场景图(并进行任何您想做的事情)所需的结构。
解析器由 Bison 和 Flex 完成,因此如果您修改源代码,请注意不要修改自动生成的文件 vrml1.cpp
(Flex 生成)或 vrml1_tab.cpp
(Bison 生成)。只有当您手头没有 Bison 或 Flex,或者您不想处理这些工具时,才方便直接修改它们。
为了说清楚:您完全不需要 Bison 和 Flex 来使用和编译这些类,只有当您想修改 vrml.l
(Flex 的令牌定义文件)或 vrml.y
(Bison 的语法)时,才需要重新生成 vrml1.cpp
和 vrml1_tab.cpp
。无论如何,您只应在出现错误时才需要修改这些文件,因为这些类的主要功能都位于 VRML.cpp
文件中。
我将解析器的设计基于 SGI 的 VRML 2.x 解析器,这是我所见过的最简单、最智能的东西之一:解析器只 _知道_ VRML 的简单类型(SFxxxx
和 MFxxxx
)和 _定义节点_,对节点本身一无所知。然后它加载一个默认节点库(定义在一个完全符合 VRML 的文件中,该文件有一个特点,即它只 _定义_ 节点而不是 _实例_),然后presto!您就可以加载任何符合 VRML 1.x 标准的文件了。
包含的 allnodes.wrl
文件就是那个标准的 VRML 1.x 节点 _库_。正常操作是像加载普通 VRML 文件一样加载这个库(它确实是!),因此标准节点会被定义,然后加载您想要的 VRML 文件/文件(您可以在同一场景中加载任意数量的 VRML 文件)。
这个类的错误检测能力相当弱,如果文件无效它只返回 FALSE
,如果文件损坏导致程序挂起我不会感到奇怪。:-m.
解析器有两个非标准属性:VRML 文件不必是唯一的 VRML 节点(有很多 VRML 文件拥有不止一个 _根_ 节点),并且任何节点(而不仅仅是 _组_ 节点)都可以有子节点。后者是由于事先不知道标准节点(无论如何,这是 VRML 1.x 标准的错误,因为用户定义的节点无法以任何方式标记它们是否有子节点…… VRML 1.x 是一个相当愚蠢的语言,如果我这么说的话:它不是 LALR,并且需要一些技巧才能用 Bison 解析它)。
MFC OpenGL 包装器
这个包装器导出了可重写的 Render
函数,因此子类只需实现该函数,而此类会处理所有其他事情。
- 鼠标交互:平移(右键)、缩放(左键,向上移动)和旋转(两个按钮)。
- 线框、实体和光滑渲染。
- 照明(它设置了 VRML 所称的 _头灯_)。
总有一天它将支持在正交和透视之间切换(只需添加方法,现在透视代码已注释掉)和 OpenGL 选择模式。
哦,对了,我差点忘了:鼠标按钮有时会 _粘住_。
VRML 部分查看器
查看器 CVRMLCanvas
基于 COGLCanvas
和 CVRMLScene
类。它接受一个简单的 CVRMLScene
并尽力渲染它。;).
支持的节点有 Material、IndexedFaceSet 和 Coordinate3。
正如我上面所说,您可以在 Robot Simulations Ltd. 的机器人库中找到免费的示例支持 VRML 文件,其中一些包含在 .zip 文件中。
示例应用程序
在 .zip 文件的 ./wrl 目录中,您会找到示例文件。只需加载其中一个并进行尝试。