Qt下实现3DS文件的读入和显示
在实现了glut框架下读入和显示3DS文件成功后,我开始了在Qt这个成熟又有活力的框架下读入和显示3DS文件。(原文出自http://blog.csdn.net/jiangcaiyang123,请转载时注明出处,谢谢。)
演示程序下载地址:这里
源代码下载地址:这里
在这次移植中,我没有使用自己的三维数学库,而是使用了Qt内置的数学库。所以需要在头文件中包含QVector3D、QMatrix4x4等头文件。使用了这些头文件之后感觉Qt这一点做得很充分,我们想的它都给我们想好了。方便虽方便,在移植的过程中我还是遇到了诸多困难。
首先还是MinGW编译器的问题,可能我的设计有一些问题吧。就是最好不在Vector数据成员前面添加数据指针,否则在Vector::size( )出了某个成员函数(这个函数应该是含有Vector::push_back()一类的语句)的作用域之后再调用就会出错。具体来说,通常是这两种情况:
class AClass { public: ... private: OtherClass* m_pOC; Qvector<OtherStruct> m_Data; }; class AClass: publicBaseClass { public: ... private: Qvector<OtherStruct> m_Data; };
在两种情况中,m_Data的size( )成员很有可能会出错。原因大概是前一个指针(或来自于m_pOC,或来自于指向基类BaseClass的指针)的内容将Vector<OtherStruct>m_Data类似于m_Size的成员给“擦洗”掉了。所以很有可能会出错。这个问题在std::vector中有,在QVector中也存在,只要是我使用了MinGW4.4,就可能会出现这个问题。解决方法就是避免以上两种情况,在使用指针的时候还是需要格外小心。
另外一个很困扰的问题是有关QImage存储的问题。QImage类从一个文件中读取图片,但是这个图片数据在类中的内部数据是上下颠倒的,也就是说我想要访问QImage中第一个像素的数据,需要调用QImage::mirror( )函数来将颠倒的数据扳正再访问,像这样:image.mirror( ).constBits( )[0]。这一点在纹理的显示中要引起注意,我就是因为这点曾怀疑是不是纹理贴错了,导致半天都没有出结果。
解决了这几个问题,尝试着读取几个3DS文件,发现还不错。只是在显示模型矩阵的时候出现了问题,有的时候模型的位置似乎不对。在Ubuntu实验下会出现深度测试出错的情况,现在我还不清楚该如何解决。不过完成了一件大事不应该庆祝一下么?