Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2020, 10:05   #21
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Я написал короткий пример, который выводит в терминал: массив вершин и массив индексов

Результат:
Цитата:
"-1 -1 0 1 -1 0 -1 1 0 1 1 0"
"1 0 0 2 0 1 0 0 2 1 0 3 3 0 4 2 0 5"
Код:
// Add these lines to the .pro file:
// QT += xml
// win32: LIBS += -lopengl32

#include <QtWidgets/QApplication>
#include <QtWidgets/QOpenGLWidget>
#include <QtXml/QDomDocument>
#include <QtCore/QFile>
#include <QtCore/QDebug>

struct DaeData {
    QString vertices;
    QString indices;
};

class OpenGLWidget : public QOpenGLWidget {
public:
    OpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}
private:
    int m_amountOfVertices;
    void initializeGL() override {
        DaeData data = getDaeData();
        qDebug() << data.vertices;
        qDebug() << data.indices;
        m_amountOfVertices = initVertexBuffers();
    }
    void resizeGL(int w, int h) override {
        glViewport(0, 0, w, h);
    }
    void paintGL() override {
        glClear(GL_COLOR_BUFFER_BIT);
    }
    int initVertexBuffers() {

    }
    DaeData getDaeData() {
        DaeData daeData;
        QDomDocument xmlDoc;
        QFile f(":/Models/Plane.dae");
        if (!f.open(QIODevice::ReadOnly)) {
            qDebug() << "Failed to open file.";
        }
        xmlDoc.setContent(&f);
        f.close();
        QDomElement root = xmlDoc.documentElement();
        QDomElement daeElem = root.firstChildElement();
        while(!daeElem.isNull()) {
            if (daeElem.tagName() == "library_geometries") {
                QDomElement geomElem = daeElem.firstChildElement();
                if (geomElem.tagName() == "geometry") {
                    QDomElement meshElem = geomElem.firstChildElement();
                    if (meshElem.tagName() == "mesh") {
                        QDomElement meshChildElem = meshElem.firstChildElement();
                        while(!meshChildElem.isNull()) {
                            if (meshChildElem.attribute("id") == "Plane-mesh-positions") {
                                QDomElement floatArrayElem = meshChildElem.firstChildElement();
                                QString strPositions = floatArrayElem.firstChild().toText().data();
                                daeData.vertices = strPositions;
                            }
                            if (meshChildElem.tagName() == "triangles") {
                                QDomElement trianglesChildElem = meshChildElem.firstChildElement();
                                while(!trianglesChildElem.isNull()) {
                                    if (trianglesChildElem.tagName() == "p") {
                                        QString strAllIndices = trianglesChildElem.firstChild().toText().data();
                                        daeData.indices = strAllIndices;
                                    }
                                    trianglesChildElem = trianglesChildElem.nextSiblingElement();
                                }
                            }
                            meshChildElem = meshChildElem.nextSiblingElement();
                        }
                    }
                }
            }
            daeElem = daeElem.nextSiblingElement();
        }
        return daeData;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    OpenGLWidget w;
    w.show();
    return a.exec();
}

Последний раз редактировалось 8Observer8; 27.11.2020 в 10:38.
8Observer8 вне форума Ответить с цитированием
Старый 27.11.2020, 11:57   #22
MrShip
Новичок
Джуниор
 
Регистрация: 24.11.2020
Сообщений: 9
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Может у вас всё получится с Assimp с первого раза.
Я скачал с GitHub уже собранные sourse файлы, поэтому скорее всего проблем с ним не будет.
Хотя если не получится буду использовать XML.
MrShip вне форума Ответить с цитированием
Старый 27.11.2020, 12:12   #23
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от MrShip Посмотреть сообщение
Я скачал с GitHub уже собранные sourse файлы
source-файлы - это исходники. Обычно в подключаемые библиотеки собирают с помощью CMake. На CMake можно из консоли собирать, можно из GUI-CMake. Бывает, что некоторые библиотеки уже собранными распространяются, например, SDL2 и SFML, но Assimp нужно собирать из source-файлов. Возможно, вы имеете ввиду, что вы подключили Assimp прямо из исходников к своему проекту, но я не пробовал так подключать Assimp.
8Observer8 вне форума Ответить с цитированием
Старый 27.11.2020, 13:05   #24
MrShip
Новичок
Джуниор
 
Регистрация: 24.11.2020
Сообщений: 9
По умолчанию

https://github.com/assimp/assimp/tre...include/assimp
А это уже не собранная библиотека? А только исходники к ней?
MrShip вне форума Ответить с цитированием
Старый 27.11.2020, 13:33   #25
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Это исходники. Нужно собрать библиотеки: либо статические с расширением ".a" (если у вас MinGW сборка Qt), либо статические с расширением ".lib" (если у вас MSVC сборка Qt). Я обе версии Qt поставил: и MinGW и MSVC, но Assimp собрал только для MinGW. Вы ни разу не собирали никакие библиотеки с помощью CMake? Этому нужно научиться, потому что подавляющее большинство библиотек нужно собирать с помощью CMake. У CMake есть GUI, где нужно указать папку с исходниками, где лежит файл CMakeList.txt и выходную пустую папку, где будут генерироваться библиотеки. Нужно будет нажать кнопку "Configure", поставить галочки (что собирать, а что нет), нажать опять "Configure" и нажать "Generate". Можете поискать видео инструкции на Youtube.

Последний раз редактировалось 8Observer8; 27.11.2020 в 14:07.
8Observer8 вне форума Ответить с цитированием
Старый 27.11.2020, 14:04   #26
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Если будете собирать Assimp с помощью инструментов MinGW, то по окончанию процесса сборки у вас будут собраны следующие библиотеки:

AssimpMinGWLibs.png

Вам нужна будет также папка "include":

AssimpInclude.png

Подключается Assimp в Qt Creator следующим образом. Нужно добавить в .pro файл:
  • Путь к "include"
  • Путь к папке с либами
  • Перечислить какие либы подключать

То есть добавить следующие строки в .pro файл:

Код:
INCLUDEPATH += "E:\Libs\assimp-5.0.1-mingw-32bit\include"
LIBS += -L"E:\Libs\assimp-5.0.1-mingw-32bit\lib"
LIBS += -lopengl32 -lassimp -lIrrXML -lzlibstatic
Далее пример, как подключать в коде на Qt C++:

main.cpp

Код:
#include <QtWidgets/QApplication>
#include <QtWidgets/QOpenGLWidget>
#include "assimp/Importer.hpp"
#include <assimp/scene.h>
#include <assimp/postprocess.h>

class OpenGLWidget : public QOpenGLWidget {
public:
    OpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget (parent) {}
private:
    void initializeGL() override {
        glEnable(GL_DEPTH_TEST);

        Assimp::Importer importer;
        const char *path = "Models/Plane.dae";
        const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);

        if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {
            qDebug() << "Assimp Error:" << importer.GetErrorString();
            return;
        }
    }
    void resizeGL(int w, int h) override {
        glViewport(0, 0, w, h);
    }
    void paintGL() override {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    OpenGLWidget w;
    w.show();
    return a.exec();
}

Последний раз редактировалось 8Observer8; 27.11.2020 в 15:57.
8Observer8 вне форума Ответить с цитированием
Старый 27.11.2020, 15:56   #27
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Я добавил проверку, что файл был загружен:

Код:
        Assimp::Importer importer;
        const char *path = "Models/Plane.dae";
        const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);

        if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {
            qDebug() << "Assimp Error:" << importer.GetErrorString();
            return;
        }
8Observer8 вне форума Ответить с цитированием
Старый 27.11.2020, 16:41   #28
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Изучать Assimp нужно на очень простых моделях: квадрат или куб. Можно даже и треугольник, но его труднее создать в Blender, а квадрат и куб в Blender есть по умолчанию. В моём примере в консоль выводятся координаты треугольников. Плоскость состоит из двух треугольников. Вывод примера:

Цитата:
1 , -1 , 0
-1 , 1 , 0
-1 , -1 , 0
1 , -1 , 0
1 , 1 , 0
-1 , 1 , 0
main.cpp

Код:
// Add these lines to .pro:
// INCLUDEPATH += "E:\Libs\assimp-5.0.1-mingw-32bit\include"
// LIBS += -L"E:\Libs\assimp-5.0.1-mingw-32bit\lib"
// LIBS += -lopengl32 -lassimp -lIrrXML -lzlibstatic

#ifdef _WIN32
#include <windows.h>
extern "C" __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
extern "C" __declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 0x00000001;
#endif

#include <QtWidgets/QApplication>
#include <QtWidgets/QOpenGLWidget>
#include <QtCore/QResource>
#include <QtCore/QDir>
#include <QtCore/QDebug>
#include "assimp/Importer.hpp"
#include <assimp/scene.h>
#include <assimp/postprocess.h>

class OpenGLWidget : public QOpenGLWidget {
public:
    OpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget (parent) {}
private:
    void initializeGL() override {
        glClearColor(0.f, 0.f, 0.f, 1.f);
        glEnable(GL_DEPTH_TEST);

        Assimp::Importer importer;

        const char *path = "Models/Plane.dae";
        const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);

        if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {
            qDebug() << "Assimp Error:" << importer.GetErrorString();
            return;
        }

        // qDebug() << scene->mNumMeshes;

        int numVertices = scene->mMeshes[0]->mNumVertices;
        float vertPositions[numVertices * 3];
        int vertPosIndex = 0;
        for (int i = 0; i < numVertices; i++) {
            vertPositions[vertPosIndex++] = scene->mMeshes[0]->mVertices[i].x;
            vertPositions[vertPosIndex++] = scene->mMeshes[0]->mVertices[i].y;
            vertPositions[vertPosIndex++] = scene->mMeshes[0]->mVertices[i].z;
            qDebug() << scene->mMeshes[0]->mVertices[i].x << ", "
                     << scene->mMeshes[0]->mVertices[i].y << ", "
                     << scene->mMeshes[0]->mVertices[i].z;
        }
    }
    void resizeGL(int w, int h) override {
        glViewport(0, 0, w, h);
    }
    void paintGL() override {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    OpenGLWidget w;
    w.show();
    return a.exec();
}
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Солнечная система(DirectX) Terray Общие вопросы C/C++ 0 11.04.2010 21:31
Солнечная система cheef Фриланс 3 24.03.2010 12:52
солнечная система в openGL nabla Помощь студентам 0 09.06.2009 15:23
Солнечная система в пасали Siroga35 Помощь студентам 1 30.03.2009 19:32