65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (9投票s)

2000年2月7日

viewsIcon

132137

downloadIcon

7418

VRML 解析器和部分查看器

  • 下载演示可执行文件 - 46 Kb
  • 下载项目源代码 - 118 Kb
  • 在线文档 - 14 Kb

    本文介绍

    • 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.cppvrml1_tab.cpp。无论如何,您只应在出现错误时才需要修改这些文件,因为这些类的主要功能都位于 VRML.cpp 文件中。

    我将解析器的设计基于 SGI 的 VRML 2.x 解析器,这是我所见过的最简单、最智能的东西之一:解析器只 _知道_ VRML 的简单类型(SFxxxxMFxxxx)和 _定义节点_,对节点本身一无所知。然后它加载一个默认节点库(定义在一个完全符合 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 基于 COGLCanvasCVRMLScene 类。它接受一个简单的 CVRMLScene 并尽力渲染它。;).

    支持的节点有 Material、IndexedFaceSet 和 Coordinate3。
    正如我上面所说,您可以在 Robot Simulations Ltd. 的机器人库中找到免费的示例支持 VRML 文件,其中一些包含在 .zip 文件中。

    示例应用程序

    在 .zip 文件的 ./wrl 目录中,您会找到示例文件。只需加载其中一个并进行尝试。

  • © . All rights reserved.