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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

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

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

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

Создание заголовочного файла

- кликаем правой кнопкой мыши по имени проекта:



- выбираем "Add New..."
- в открывшемся окне выбираем "С++" "С++ Header File", как на рисунке:



- нажимаем кнопку "Choose..."
- в поле "Name" вводим имя заголовочного файла
- нажимаем кнопку "Next"
- нажимаем кнопку "Finish"
8Observer8 вне форума Ответить с цитированием
Старый 18.08.2013, 11:29   #12
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Создание файла ресурсов

- кликаем правой кнопкой мыши по имени проекта:



- выбираем "Add New..."
- в открывшемся окне выбираем "Qt" "Qt Resource file", как на рисунке:



- нажимаем кнопку "Choose..."
- в поле "Name" вводим имя файла ресурсов
- нажимаем кнопку "Next"
- нажимаем кнопку "Finish"

- в открывшемся окне, нажимаем кнопку "Add" и выбираем "Add Prefix"
- в поле "Prefix" вводим путь-префикс, к примеру корень: /
- нажимаем кнопку "Add" и выбираем "Add Files"
- в открывшемся окне, выбираем файлы и нажимаем кнопку "Open"
8Observer8 вне форума Ответить с цитированием
Старый 18.08.2013, 11:37   #13
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Анимация, наложение текстур, выбор объектов на экране для дальнейшей манипуляции с ними

Код взят по следующей ссылке (файлы проекта прикрепил к этому сообщению): http://www.gamedev.ru/code/articles/OpenGL_Qt4_part2

На экране два объекта с текстурами. Объекты плавно перемещаются вверх-вниз и при этом вращаются. Можно нажать на объект, тогда он остановится. Через меню можно поменять текстуры объектов и остановить оба объекта.

Из статьи по ссылке выше:
Цитата:
Во 2-ой части продолжается рассмотрение работы с OpenGL на Qt 4. Читатель познакомится с настройкой контекста OpenGL, созданием анимации и простым наложением текстур. Заодно в рамках «чистого» OpenGL будет рассмотрена интерактивная графика с помощью режима выбора (выбираем объекты на экране для дальнейшей манипуляции с ними), в рамках «чистого» Qt будет продемонстрировано создание главного окна, меню (menu bar), задействованы механизм сигналов и слотов и технология дерева объектов (иерархии объектов).


- создаём пустой проект c именем: Animation (см. Создание пустого проекта в Qt)

- добавляем класс "MainWindow" со следующими атрибутами:

Class name: "MainWindow"
Base class: QMainWindow
Type information: none

Примечание: см. Добавление класса

- добавляем класс "Scene3D" со следующими атрибутами:

Class name: "Scene3D"
Base class: QGLWidget
Type information: Inherits QWidget

Примечание: см. Добавление класса

- добавляем заголовочный файл с именем glext

Примечания:
1) Содержимое файла glext.h: http://www.opengl.org/registry/api/GL/glext.h
2) См. Создание заголовочного файла

- добавляем файл ресурсов со следующими атрибутами:

Name: pictures
Prefix: /

Примечания:
1) Рисунки под текстуры: http://www.gamedev.ru/code/articles/...aemie_teksturi
2) см. Создание файла ресурсов

Примечание по проекту:
1) Скорее всего, при построении проекта возникнет ошибка: "error: 'gluPickMatrix' was not declared in this scope". Решение: добавить в файл "scene3d.cpp":
Код:
#include <GL/glu.h>
2) В файле "scene3d.cpp" в функции void Scene3D::genTextures() строки:
Код:
    textureID[0]=bindTexture(QPixmap(QString("../textures/picture1.jpg")), GL_TEXTURE_2D);
    ...
    textureID[1]=bindTexture(QPixmap(QString("../textures/picture2.jpg")), GL_TEXTURE_2D);
    ...
нужно заменить на следующие:
Код:
    textureID[0]=bindTexture(QPixmap(QString(":textures/picture1.jpg")), GL_TEXTURE_2D);
    ...
    textureID[1]=bindTexture(QPixmap(QString(":textures/picture2.jpg")), GL_TEXTURE_2D);
    ...
3) Не забудьте в файл ".pro" добавить строчку:

Код:
QT += opengl
Копируем следующий код из прикреплённых файлов в соответствующие файлы проекта.

P.S. Есть проблема, в которой я никак не могу разобраться. Но если кто-то поможет понять - буду очень признателен. Проблема в том, что при завершении приложения появляются сообщения:

- http://i5.pixs.ru/storage/2/2/5/53pn...12_7162225.png
- http://i5.pixs.ru/storage/2/3/1/54pn...17_7162231.png
Вложения
Тип файла: zip Animation.zip (115.2 Кб, 22 просмотров)

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

Построение отрезка по двум введённым координатам в 3D-пространстве (MDI проект)



Это почти тот же самый пример, что и этот: http://programmersforum.ru/showpost....7&postcount=10

За исключением того, что это MDI проект.

- Камеру можно поворачивать с помощью мыши
- Oтдалять и приближать с помощью колёсика мыши

Я решил, что для демонстрации того или иного аспекта OpenGL - буду создавать мини-MDI-редакторы.
Вложения
Тип файла: zip mdiLine.zip (8.9 Кб, 20 просмотров)

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

Построение треугольника (используем QMdiArea вместо QWorkspace)

Как оказалось QWorkspace устарел. Вместо него нужно использовать QMdiArea.

Рисуем треугольник по трём точкам.



Линии треугольника рисовались по аналогии с осями координат.

Построение осей координат:

Код:
void Scene3D::drawAxis() // построить оси координат
{
    // устанавливаем ширину линии приближенно в пикселях
    glLineWidth(3.0f);
    // до вызова команды ширина равна 1 пикселю по умолчанию

    // устанавливаем цвет последующих примитивов
    glColor4f(1.00f, 0.00f, 0.00f, 1.0f);
    // ось x красного цвета
    glBegin(GL_LINES); // построение линии
    glVertex3f( 1.0f,  0.0f,  0.0f); // первая точка
    glVertex3f(-1.0f,  0.0f,  0.0f); // вторая точка
    glEnd();

    QColor halfGreen(0, 128, 0, 255);
    qglColor(halfGreen);
    glBegin(GL_LINES);
    // ось y зеленого цвета
    glVertex3f( 0.0f,  1.0f,  0.0f);
    glVertex3f( 0.0f, -1.0f,  0.0f);

    glColor4f(0.00f, 0.00f, 1.00f, 1.0f);
    // ось z синего цвета
    glVertex3f( 0.0f,  0.0f,  1.0f);
    glVertex3f( 0.0f,  0.0f, -1.0f);
    glEnd();
}
Построение треугольника:
Код:
void Scene3D::drawTriagle()
{
    glLineWidth(10.0f);

    glColor4f(0.00f, 1.00f, 0.00f, 1.0f);

    glBegin(GL_LINES);
    glVertex3f(firstPoint->x(),  firstPoint->y(),  firstPoint->z());
    glVertex3f(secondPoint->x(),  secondPoint->y(),  secondPoint->z());
    glEnd();

    glBegin(GL_LINES);
    glVertex3f(secondPoint->x(),  secondPoint->y(),  secondPoint->z());
    glVertex3f(thirdPoint->x(),  thirdPoint->y(),  thirdPoint->z());
    glEnd();

    glBegin(GL_LINES);
    glVertex3f(thirdPoint->x(),  thirdPoint->y(),  thirdPoint->z());
    glVertex3f(firstPoint->x(),  firstPoint->y(),  firstPoint->z());
    glEnd();
}
Вложения
Тип файла: zip mdiTriangle.zip (9.2 Кб, 16 просмотров)

Последний раз редактировалось 8Observer8; 24.08.2013 в 18:53.
8Observer8 вне форума Ответить с цитированием
Старый 24.08.2013, 19:47   #16
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Построение примитива



Чтобы построить примитив, нужно задать:
Код:
GLfloat VertexArray[3][3]; // массив вершин
GLfloat ColorArray[3][3]; // массив цветов вершин
GLubyte IndexArray[1][3]; // массив индексов вершин
Инициализировать их:
Код:
void Scene3D::getVertexArray() { // // определить массив вершин
    VertexArray[0][0]=firstPoint->x();
    VertexArray[0][1]=firstPoint->y();
    VertexArray[0][2]=firstPoint->z();

    VertexArray[1][0]=secondPoint->x();
    VertexArray[1][1]=secondPoint->y();
    VertexArray[1][2]=secondPoint->z();

    VertexArray[2][0]=thirdPoint->x();
    VertexArray[2][1]=thirdPoint->y();
    VertexArray[2][2]=thirdPoint->z();
}

void Scene3D::getColorArray() { // определить массив цветов вершин
    for (int i=0; i<3; i++)
    {
        ColorArray[i][0]=0.1f*(qrand()%11);
        ColorArray[i][1]=0.1f*(qrand()%11);
        ColorArray[i][2]=0.1f*(qrand()%11);
    }
}

void Scene3D::getIndexArray() { // определить массив индексов вершин
    IndexArray[0][0]=2;
    IndexArray[0][1]=1;
    IndexArray[0][2]=0;
}
И нарисовать:
Код:
void Scene3D::drawTriagle()
{
    glVertexPointer(3, GL_FLOAT, 0, VertexArray);
    glColorPointer(3, GL_FLOAT, 0, ColorArray);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, IndexArray);
}
Вложения
Тип файла: zip mdiPrimitive.zip (9.5 Кб, 16 просмотров)
8Observer8 вне форума Ответить с цитированием
Старый 25.08.2013, 00:14   #17
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Построение графика и работа с таблицей



Данный пример не относится к OpenGL, но в будущем он нам пригодится, чтобы выводить вспомогательную информацию на графики.

Пример так же демонстрирует работу с xml-файлом средствами Qt. Мы меняем координаты в таблице и изменения сразу же отображаются на графике (использована технология Model/View). Далее мы нажимаем Ctrl+S и сохраняем таблицу. Позже мы можем загрузить её.

Table.xml для данного примера:
Цитата:
<Table nrows="6" ncols="2">
<point x="1.32" y="1.98"/>
<point x="2.55" y="3.91"/>
<point x="3.38" y="3.88"/>
<point x="5.23" y="4.34"/>
<point x="8.23" y="5.55"/>
<point x="9.99" y="8.53"/>
</Table>
Работа с графиками возлагается на библиотеку Qwt. Вот весь код, который строит график для данного примера:

plotPanel.cpp
Код:
#include "plotpanel.h"
#include <QHBoxLayout>
#include <QDebug>
#include <qwt_symbol.h>

PlotPanel::PlotPanel(QWidget *parent) :
    QDialog(parent)
{
    plot = new QwtPlot;
    curve = new QwtPlotCurve;

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addWidget(plot);
    this->setLayout(mainLayout);

    this->setWindowTitle("Plot Panel");
}

void PlotPanel::updatePanel(QStandardItemModel *model)
{
    plot->setAxisScale(QwtPlot::yLeft, 0.0, 10);
    plot->setAxisScale(QwtPlot::xBottom, 0.0, 10);

    curve->detach();

    curve->setTitle(tr("Points"));
    curve->setPen(QPen(Qt::blue, 4));
    curve->setRenderHint(QwtPlotItem::RenderAntialiased, true);

    QwtSymbol *symbol = new QwtSymbol(QwtSymbol::Ellipse, QBrush(Qt::yellow),
                                      QPen(Qt::red, 2), QSize(8, 8));
    curve->setSymbol(symbol);

    QPolygonF points;

    double x, y;
    for (int row = 0; row < model->rowCount(); row++) {
        QModelIndex index = model->index(row, 0);
        x = model->data(index).toDouble();

        index = model->index(row, 1);
        y = model->data(index).toDouble();

        points << QPointF(x, y);
    }

    plot->replot();

    curve->setSamples(points);
    curve->attach(plot);
}
Вложения
Тип файла: zip mdiPlot.zip (19.4 Кб, 27 просмотров)

Последний раз редактировалось 8Observer8; 25.08.2013 в 00:20.
8Observer8 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скриншот экрана через OpenGL UltraCoder Qt и кроссплатформенное программирование С/С++ 0 08.08.2012 17:46
Путь к IB через программу svyatoi777 Помощь студентам 0 25.03.2011 19:23
Загрузка в Image через путь, выбранный в ShellListView artemavd Общие вопросы Delphi 1 20.08.2010 19:12
Вывод картинки через OpenGL KIV_95 Помощь студентам 1 15.08.2010 12:18
Как программно узнать путь к базе.Соединение через adoconnection. Moel БД в Delphi 1 26.10.2007 08:32