有关Assimp与Qt3D

有关Assimp与Qt3D

       最近朋友们会向我提及有关Qt3D的问题,我这里统一地向大家分析一下,希望我自己的一点对Qt3D和Assimp库的一些看法对大家能够有所帮助。

原创文章,反对未声明的引用。原博客地址http://blog.csdn.net/gamesdev/article/details/21164081

       Qt3D在Qt4时代就已经存在了,当时Qt这个项目还处于诺基亚的管理之下。到了Digia接手Qt的时候,Qt3D作为遗留项目保留了起来。这里有我以前写的有关Qt3D的文字。最初Qt5出来的时候并没有包括Qt3D,很显然,因为要对Qt4时代诸多Qt子项目进行移植谈何容易!于是我们看到Qt5.0的时候Qt库非常精简,仍然有很多的Qt4库没有被移植过来,而且还有很多Bug!我想Digia希望通过Qt5.1、Qt5.2和Qt5.3对这些Bug进行修复,这样一个健壮的Qt基础库才能够支撑诸多Qt4时代的子项目。

       Qt3D就是其中的一个,幸运的是,Qt源码重要的贡献群体KDAB正着手对Qt3D作Qt5的移植。其实对Qt3D的移植是很有必要的。因为在Qt4时期的QtOpenGL库中的一些类QGLWidget、QGLFunctions、QGLBuffer、QGLShader、QGLShaderProgram、QGLFrameBufferObject等等被标记为obsolete的了,取而代之的是QWindow、QOpenGLFunctions、QOpenGLBuffer、QOpenGLShader、QOpenGLShaderProgram、QOpenGLTexture(Qt5.2新增)、QOpenGLDebugLogger、QOpenGLFrameBufferObject等等。使用过Qt3D的朋友知道,Qt3D里面有一个类叫作QGLTexture2D,这是专门适配Assimp库用来处理2D图片的类。但是Qt5.2已经有了QOpenGLTexture,事实上它包括了1D、2D、3D、Cube纹理的处理。作为Qt的开发者会问,我们究竟要使用哪一个纹理相关的类呢?除此外QGLIndexBuffer、QGLVertexBundle这些类,分别对应OpenGL中的索引缓存和顶点缓存,但怎么说也没有Qt5中的QOpenGLBuffer来得科学。再说Qt3D源码正在重构,KDAB希望在Qt5.3能够看到它的身影,在Jira上也能看到Qt3D的RoadMap(路线图)以及进展,所以现在Qt5.2中使用未定型的Qt3D,个人感觉还是有点儿早。

有关Assimp与Qt3D_第1张图片

       Qt3D内有关模型的导入,使用的是Assimp库,于是有些错误可能来自于Assimp库。比如说有时候会出现“Assetimporter error: Chunk is too large”这样的问题,其实这个问题不是来自Qt3D的,而是底层的Assimp库的。这里我分享一个Assimp库实现的软件,叫“assimpviewer”。它可以方便地浏览各种模型格式的文件,其下载地址在这里。它是用Assimp库和DirectX来实现的,很遗憾只有Windows版。如果assimpviewer无法打开,那么Qt3D可能也载入不了了。下面是尝试载入一3ds文件的时候出现的错误:

有关Assimp与Qt3D_第2张图片

       出现“Asset importer error: Chunkis too large”这样的问题,一般是载入3ds格式文件的时候引入的。其实3ds这个格式解析的程序很多,但是由于3ds的格式规范是大家hack出来的,因此各家读取的出入很大。我也曾经实现过用Qt和OpenGL载入3ds格式的文件,其中涉及到了读取3ds格式的思想,包含了chunk的定义。地址在这里,有兴趣的话可以看看这究竟是如何实现的。

你可能感兴趣的:(Assimp,Qt3D,Qt游戏开发,OpenGL探索)