查看: 4189|回复: 5

问题:模型能显示却如何导出?

[复制链接]

该用户从未签到

发表于 2008-4-16 16:26:04 | 显示全部楼层 |阅读模式
声明一下,我是菜鸟
前段时间写了个依据CT图像序列生成血管树的程序(显示模型方面是用opengl写的)
现在想用在osg的场景里面,碰到了一些问题:
1.参考了mailling list和一些意见,我看了osgteapot例子,通过继承一个drawable类,我初步实现了opengl代码和osg的整合,可以让血管树通过osg的viewer类显示,但是模型 放置的位置很不好,我觉得应该是我设置的boundingbox不合理的问题,但osgteapot例子里面boundingbox的计算问题我就看不太懂,特别是expandby的使用,我想请教一下各位, 尽量让我弄清楚,在下先行谢过。
 特别是
 bbox.expandBy(osg::Vec3(p[j][k][0],p[j][k][1],p[j][k][2]));
 bbox.expandBy(osg::Vec3(q[j][k][0],q[j][k][1],q[j][k][2]));
 osgteapot里面的这两句分别对应的是什么意思?
2.前面已经说到血管树模型能通过viewer类显示,但是导出模型时发现模型文件里面没有顶点和边的信息,只是一个含有纹理等状态信息的文件。我想把osgteapot里面绘制出来的  teapot 导出来,结果也是只有纹理等信息,而几何体的信息却没有。我用的是osgDB::writeNodeFile来导出模型。
 导出的osg模型文件为以下内容:

Group {
  nodeMask 0xffffffff
  cullingActive TRUE
  num_children 1
  Geode {
    nodeMask 0xffffffff
    cullingActive TRUE
    StateSet {
      rendering_hint DEFAULT_BIN
      renderBinMode INHERIT
      textureUnit 0 {
        GL_TEXTURE_GEN_S ON
        GL_TEXTURE_GEN_T ON
        GL_TEXTURE_GEN_R ON
        GL_TEXTURE_GEN_Q ON
        GL_TEXTURE_2D ON
        Texture2D {
          file "Images/reflect.rgb"
          wrap_s CLAMP
          wrap_t CLAMP
          wrap_r CLAMP
          min_filter LINEAR_MIPMAP_LINEAR
          mag_filter LINEAR
          maxAnisotropy 1
          borderColor 0 0 0 0
          borderWidth 0
          useHardwareMipMapGeneration TRUE
          unRefImageDataAfterApply FALSE
          internalFormatMode USE_IMAGE_DATA_FORMAT
          resizeNonPowerOfTwo TRUE
        }
        TexGen {
          mode SPHERE_MAP
        }
      }
    }
    num_drawables 1
  }
}
欲请教各位,这是什么原因?能通过viewer类显示,却不能导出到硬盘吗?

该用户从未签到

发表于 2008-4-16 16:36:41 | 显示全部楼层
expandBy函数用于扩展包围盒,那两行代码的意思是扩展包围盒使其可以容纳指定的Vec3顶点,这样把teapot的所有顶点容纳下之后,这个包围盒自然就可以把整个teapot容纳下了。
至于不能写入磁盘,这个恐怕也是理所当然的。osg进行模型文件读取的时候,会把读入的顶点数据记录到Geometry中,从而在场景中显示顶点的内容;写入的时候,同样也要搜索场景中的Geometry数据,以获得顶点信息并写入文件。自己重载Drawable类并在其中执行OpenGL语句的话,osg恐怕找不到对应的Geometry顶点信息,因而也就写不出相应的数值来,当然用stateset指定的纹理信息,还有节点结构还是可以写出来的。
osgteapot中使用绘制样条曲面的命令,自然不会提供什么顶点信息;而您的程序也许也是如此~~

该用户从未签到

 楼主| 发表于 2008-4-16 16:51:34 | 显示全部楼层
没想到版主回复那么快!十分感谢
就是说绘制的图形必须是具有顶点信息的图元,否则是不能写入磁盘的。可以这样理解吗?

该用户从未签到

 楼主| 发表于 2008-4-16 16:54:17 | 显示全部楼层
这么说来,显示模型与模型的存储是两码事。
我以为只要能显示出来的,就能够被存储。

该用户从未签到

发表于 2008-4-16 19:50:22 | 显示全部楼层
原帖由 soda 于 2008-4-16 16:54 发表
这么说来,显示模型与模型的存储是两码事。
我以为只要能显示出来的,就能够被存储。


呵呵~~尽量用Geometry类实现绘图吧,如果只是glVertex或glVertexPointer的话,还是很容易转换的

该用户从未签到

 楼主| 发表于 2008-4-16 20:58:34 | 显示全部楼层
嗯,好的,多谢王锐指教。
我还有一事不明,想请教你:
我试过对模型进行鼠标点选,发现一些奇怪的问题。
对一些简单物体进行点选时,使用PolytopeIntersector选择成功,而使用LinesegmentIntersector则选择失败。
而对某些物体时情况又刚好相反,使用Line成功,而Polytope失败。
请问是应该根据不同情况使用不同类型的交集检测吗?
另外PlaneIntersector是用来选择线段的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表