Войти
ПрограммированиеФорумГрафика

Трехмерный движок для QT

Страницы: 1 2 3 Следующая »
#0
16:17, 28 авг. 2016

Пробывал делать движок на OpenGL в QT. В теории это должно работать на всех платформах(которые qt поддерживает).
Успешно получалось запускать для android.
Может для кого будет полезным.
https://github.com/DistinctVision/QScrollEngine


#1
17:48, 28 авг. 2016

Creator
> Пробывал делать движок на OpenGL в QT.
Зачем Qt? Он слишком монструозен, минимальный "Hello, world!" тянет за собой мегабайты и десятки мегабайт библиотек.
Почему, не SDL, например?

#2
18:23, 28 авг. 2016

Creator, тебе бы  сделать более читабельный код,сделать cmakelist,доделать разные фичи,кое-где код переписать,а так не плохо

#3
19:10, 28 авг. 2016

Panzerschrek[CN]
Qt просто уютный и с ним не возникает больших проблем при переходе на другие платформы + много чего уже есть. А вот простых трехмерных движков, которые легко было бы использовать в связке с Qt не видел.
С SDL не пробывал работать.

sanoraag
В коде не все идеально, но в целом там вроде вполне читабельно.
> сделать cmakelist
А есть смысл? Сам проект qt не требует изменений под разные платформы.

#4
19:39, 28 авг. 2016

не так давно искал что-то подобное, вопрос по возможностям - на сколько сложно сделать, к примеру, куб с полупрозрачным одноцветным материалом(шейдером) и двусторонними гранями? спрашиваю чтобы понять стоит ли смотреть, т.е. на OpenGL это сделать очень просто, а вот в Unity придется лезть в такие дебри... - так какой у вас уровень абстрактности?

#5
21:06, 28 авг. 2016

Creator
> А есть смысл? Сам проект qt не требует изменений под разные платформы.
смысл в том что кто-то захочет писать в VS, а кто-то в Notepad++, Qt Creator - не единственная IDE

#6
7:29, 29 авг. 2016

leonardo98
> на сколько сложно сделать, к примеру, куб с полупрозрачным одноцветным
> материалом(шейдером) и двусторонними гранями?

Ну вот простой пример использования:

#include <QApplication>

#include "QScrollEngine/QScrollEngine.h"

//QScrollEngineContext - "корень движка"
void initScene(QScrollEngine::QScrollEngineContext* context)
{
    using namespace QScrollEngine;

    QScene* scene = new QScene(context);//создаем сцену, в которой будут находится куб
    QEntity* cube = new QEntity(scene);//создаем объект куба на сцене, но он пока пустой
    QMesh* meshCube = new QMesh(context);//сетка куба, однако внутренние грани не будут отображаться
    QGLPrimitiv::createCube(meshCube);
    QMesh* negMeshCube = new QMesh(meshCube);//для отображения внутренних граней можно сделать отдельную сетку
    negMeshCube->flipTriangles();//оборачиваем грани
    negMeshCube->updateNormals();//обновляем нормали, раз меняли треугольники
    negMeshCube->applyChanges();//отправим изменения в память видеокарты
    negMeshCube->updateLocalBoundingBox();//раз менялась сетка, то надо по идее обновлять bounding box,
    //однако положение вершин не менялось, сейчас это лишнее

    QShPtr shader(new QSh_Color(QColor(255, 0, 0, 50)));//Шейдер отображения куба
    QEntity::Part* partA = cube->addPart(meshCube, shader);//присоединяем сетку к объекту
    partA->setAlpha(true);//указваем, что он будет прозрачным, и к этому объекту будет применен алгоритм художника
    QEntity::Part* partB = cube->addPart(negMeshCube, shader);
    partB->setAlpha(true);

    cube->setPosition(0.0f, 0.0f, -10.0f);// перемещаем куб вперед
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QScrollEngine::QScrollEngineWidget widget;//Создем виджет движка.
    widget.show();
    initScene(&widget);
    return app.exec();
}

#7
10:30, 29 авг. 2016

Creator
> QMesh* negMeshCube = new QMesh(meshCube);//для отображения внутренних граней
> можно сделать отдельную сетку
> negMeshCube->flipTriangles();//оборачиваем грани
> negMeshCube->updateNormals();//обновляем нормали, раз меняли треугольники
> negMeshCube->applyChanges();//отправим изменения в память видеокарты
> negMeshCube->updateLocalBoundingBox();//раз менялась сетка, то надо по идее
> обновлять bounding box,
> //однако положение вершин не менялось, сейчас это лишнее
эх, тоже костыльное решение - а если таких кубов много?
но в целом выглядит неплохо, я сделал форк, посмотрю что можно сделать

#8
14:21, 29 авг. 2016

как-то странно "собирается" Sample

+ Показать

update: кароч, из коробки не собирается, хоть тресни, покрутил параметры, но плюнул, потом еще гляну код - думаю кое-что пригодится

#9
17:39, 29 авг. 2016

leonardo98
Какая версия Qt?

#10
17:51, 29 авг. 2016

Creator
> Какая версия Qt?
5.4

#11
17:54, 29 авг. 2016

leonardo98
> "cl" ­Ґ пў«пҐвбп ў­гв७­Ґ© Ё«Ё ў­Ґи­Ґ©
Собираешь студийным тулченом? Если да - проверь остальное собирается или нет.

похоже на конвульсии русской вижуал-студии
#12
17:56, 29 авг. 2016

Try
> Собираешь студийным тулченом? Если да - проверь остальное собирается или нет.
minigw тоже не собрался

update: может проблема и у меня, т.к. ранее стояли еще более старшие версии - 5.2.1 и 5.3, но если нужно-то что-то специфическое - стоит указать это где-то

#13
19:39, 29 авг. 2016

Действительно, не работает на версиях ниже 5.4, указал в описании.
Используются классы QOpenGLWidget, QOpenGLShaderProgram... , которые появились только начиная с этой версии.
В теории можно заменить просто эти классы на QGLWidget, QGLShaderProgram (которые сейчас объявлены как deprecated), и все должно работать наверное.
Кстати, в версии 5.4 и ниже можно выбирать профиль для компилятора поддерживающий QOpenGL и не поддерживающий его. Понятно, что нужен первый тип.
Попробовал у себя на mingw и msvc 5.4 - полет нормальный.

#14
22:47, 29 авг. 2016

leonardo98
> а вот в Unity придется лезть в такие дебри
Какие дебри? 2 pass-а в шейдере делаешь с разным backface culling и готово.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.