Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: lolbla2 от Март 10, 2012, 18:35



Название: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: lolbla2 от Март 10, 2012, 18:35
Пример использования:

1) Подключаем нужные заголовочные файлы к проекту, а именно loader.h, loader_global.h
2) В файле .pro прописываем путь к DLL, LIBS += "путь к dll"

3) В программе нужно создать объект структуры t3DModel, то есть саму модель, в которой хранится информация о вершинах, полигонах, материалах и т.д.

Пример кода:
Код
C++ (Qt)
#include "widget.h"
#include "ui_widget.h"
 
 
t3DModel g_World;
Loader loader;
Widget::Widget(QWidget *parent, QGLWidget *shareWidget) :
   QGLWidget(parent,shareWidget),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
   // загрузка файла
   loader.Import3DS(&g_World,"D:\\Park.3ds");
   qDebug()<<g_World.pMaterials.size()<<endl;
   qDebug()<<g_World.pObject.size();
}
 
Widget::~Widget()
{
   delete ui;
}
 
void Widget::initializeGL()
{
   glEnable(GL_DEPTH_TEST);          //включить Z buffer
   glEnable(GL_TEXTURE_2D);          //включить текстуры
   glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
}
void Widget::resizeGL(int w, int h)
{
   if (h==0)
     {
        h=1;
     }
           // установка области видимости
    glViewport(0,0,w,h);
           //установка матрицы проекции для того чтобы производить операции над матрицами
    glMatrixMode(GL_PROJECTION);
           //установка единичной матрицы
    glLoadIdentity();
           //установка перспективы
    gluPerspective(45.0f,(float)w/(float)h, 1, 500.0f);
           //установка матрицы в режим отображения модели
    glMatrixMode(GL_MODELVIEW);
}
 
void Widget::paintGL()
{
           glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //очищаем буффер цвета и z буфер
           glLoadIdentity();
           gluLookAt(0, 3.5f, 30, 0, 0, 0, 0, 1, 0);    //устанавливаем позицию камеры
 
           //отрисовка
           //цикл по всем объектам
           for(int i = 0; i < g_World.numOfObjects; i++)
           {
                   if(g_World.pObject.size() <= 0) break;
 
                   t3DObject *pObject = &g_World.pObject[i];
 
                   //если у объекта есть текстура, то надо её связать, то есть применить
                   if(pObject->bHasTexture)
                   {
 
                           glEnable(GL_TEXTURE_2D);
 
                           glColor3ub(255, 255, 255);
 
                           glBindTexture(GL_TEXTURE_2D, g_Texture[pObject->materialID]);
                   }
                   else
                   {
 
                           glDisable(GL_TEXTURE_2D);
 
                           glColor3ub(255, 255, 255);
                   }
                   //начало отрисовки в режиме закрашенных треугольников
                   glBegin(GL_TRIANGLES);
 
                   for(int j = 0; j < pObject->numOfFaces; j++) //цикл по полигонам
                   {
                           for(int whichVertex = 0; whichVertex < 3; whichVertex++) //цикл по вершинам полигона
                           {
                                   int index = pObject->pFaces[j].vertIndex[whichVertex];
                                   //установка нормали
                                   glNormal3f(pObject->pNormals[ index ].x, pObject->pNormals[ index ].y, pObject->pNormals[ index ].z);
                                   //если есть текстура надо установить текстурные координаты
                                   if(pObject->bHasTexture)
                                   {
 
                                           if(pObject->pTexVerts)
                                           {
                                                   glTexCoord2f(pObject->pTexVerts[ index ].x, pObject->pTexVerts[ index ].y);
                                           }
                                   }
                                           //устанавливаем цвет объекта
                                   if(g_World.pMaterials.size() && pObject->materialID >= 0)
                                   {
                                           BYTE *pColor = g_World.pMaterials[pObject->materialID].color;
 
                                           glColor3ub(pColor[0], pColor[1], pColor[2]);
                                   }
                                   //рисуем вершину
                                   glVertex3f(pObject->pVerts[ index ].x, pObject->pVerts[ index ].y, pObject->pVerts[ index ].z);
                           }
                   }
                   glEnd();
           }
}
 

исходник: http://rapid.ufanet.ru/5847792

P.S. : Подскажите как у вас тут прикрепить архив, пишет что нельзя.... А то на этом хостинге только 30 дней хранится...


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: kambala от Март 10, 2012, 19:21
P.S. : Подскажите как у вас тут прикрепить архив, пишет что нельзя.... А то на этом хостинге только 30 дней хранится...
а не проще на каком-нить гитхабе разместить?


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: lolbla2 от Март 10, 2012, 19:38
P.S. : Подскажите как у вас тут прикрепить архив, пишет что нельзя.... А то на этом хостинге только 30 дней хранится...
а не проще на каком-нить гитхабе разместить?

ни разу не пользовался, лень разбираться как он работает((


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: Igors от Март 10, 2012, 19:53
Интересное кино. Сами написали?


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: kambala от Март 11, 2012, 01:15
P.S. : Подскажите как у вас тут прикрепить архив, пишет что нельзя.... А то на этом хостинге только 30 дней хранится...
а не проще на каком-нить гитхабе разместить?

ни разу не пользовался, лень разбираться как он работает((
хоть какую-нибудь систему контроля версий желательно постигнуть


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: IGreench от Октябрь 26, 2012, 07:36
Автор либы еще бывает тут?
Может ли кто поделиться данной лялькой? Прям нужная сильно вещь  :)
А вообще, рад что таким делятся! Спасибо таким людям  ;)


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: lolbla2 от Март 04, 2013, 12:27
Автор либы еще бывает тут?
Может ли кто поделиться данной лялькой? Прям нужная сильно вещь  :)
А вообще, рад что таким делятся! Спасибо таким людям  ;)

Бывает тут, но редко)) Вам нужна либа?


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: IGreench от Март 04, 2013, 12:43
Нужна =)


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: quiet_readonly от Март 07, 2013, 23:08
Нужна =)
Не уверен, что необходимость столь же острая, как в октябре, но посоветую модуль Qt3D либо библиотеку assimp (на которую, собственно, и опирается Qt3D). Также могу выложить на гитхаб самописную библиотечку + проверочную программу, там реализованы загрузка с помощью assimp и простенький рендеринг (без шейдеров).


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: IGreench от Март 08, 2013, 07:48
Было бы очень здорово!


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: quiet_readonly от Март 09, 2013, 23:04
Было бы очень здорово!
https://github.com/sergey-shambir/toAlexeyMalov (https://github.com/sergey-shambir/toAlexeyMalov)
Загрузка моделей - в библиотечке union.


Название: Re: Загрузчик .3ds (3ds max ) файлов в виде DLL
Отправлено: IGreench от Март 09, 2013, 23:07
Спасибо!