Russian Qt Forum
Ноябрь 24, 2024, 01:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Передача координат вершин фигуры по сети  (Прочитано 18864 раз)
8Observer8
Гость
« : Март 28, 2014, 06:22 »

Привет!

У Макса Шлее есть пример с рисованием пирамиды в 3D (книга "Qt 4.8", глава 23 "Работа с OpenGL"). Я хочу переделать этот пример. В моём примере будет запущено две такие программы. Одна, как клиент, а другая, как сервер. Клиент подсоединяется к серверу. Когда пользователь клиента (или сервера) вращает мышкой пирамиду, то начинают вращаться обе пирамиды и у клиента и у сервера.

Координаты у него задаются один раз при создании пирамиды:
Код
C++ (Qt)
GLuint OGLPyramid::createPyramid(GLfloat fSize/*=1.0f*/)
{
   GLuint n = glGenLists(1);
 
   glNewList(n, GL_COMPILE);
   glBegin(GL_TRIANGLE_FAN);
   qglColor(Qt::green);
   glVertex3f(0.0, fSize, 0.0);
   glVertex3f(-fSize, -fSize, fSize);
   glVertex3f(fSize, -fSize, fSize);
   qglColor(Qt::yellow);
   glVertex3f(fSize, -fSize, -fSize);
   qglColor(Qt::blue);
   glVertex3f(-fSize, -fSize, -fSize);
   qglColor(Qt::white);
   glVertex3f(-fSize, -fSize, fSize);
   glEnd();
 
   glBegin(GL_QUADS);
   qglColor(Qt::red);
   glVertex3f(-fSize, -fSize, fSize);
   glVertex3f(fSize, -fSize, fSize);
   glVertex3f(fSize, -fSize, -fSize);
   glVertex3f(-fSize, -fSize, -fSize);
   glEnd();
   glEndList();
 
   return n;
}
 

А вот как потом до них добраться? Есть ли способ получения координат в любой момент времени? Скорее всего, мне нужно будет передавать координаты, когда происходит событие mouseMoveEvent().

Заранее спасибо за ответы!
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Март 28, 2014, 06:26 »

Вам нужно будет передовать положение и направление камеры.
Записан
8Observer8
Гость
« Ответ #2 : Март 28, 2014, 06:28 »

Какой ещё камеры Улыбающийся Я только пример открыл, там в книге про камеру ничего не написано Улыбающийся

Скажите, пожалуйста, что такое камера? И как до неё добраться? Чем она задаётся? У неё есть координаты?
« Последнее редактирование: Март 28, 2014, 07:26 от 8Observer8 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Март 28, 2014, 06:41 »

Какой ещё камеры Улыбающийся Я только пример открыл, там в книге про камеру ничего не написано Улыбающийся
А я книгу эту в глаза не видел и понятия не имею, что там в примере. Улыбающийся
Смысл в том, что нужно передовать не новые координаты сцены, а параметры матрицы трансформации или параметры камеры.
Записан
8Observer8
Гость
« Ответ #4 : Март 28, 2014, 06:50 »

Я скопирую весь код примера сюда. Добавил класс OGLPyramid на форму в Widget через "Promoted to..." Где здесь параметры матрицы трансформации или параметры камеры? Видимо, матрица трансформации это: "glTranslatef(0.0, 0.0, -3.0)"). А точно "или", а не "и"? Что такое "параметры камеры"?

main.cpp
Код
C++ (Qt)
#include "MainWindow.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MainWindow w;
   w.show();
 
   return a.exec();
}
 

OGLPyramid.h
Код
C++ (Qt)
#ifndef OGLPYRAMID_H
#define OGLPYRAMID_H
 
#include <QGLWidget>
 
class OGLPyramid : public QGLWidget {
private:
   GLuint  m_nPyramid;
   GLfloat m_xRotate;
   GLfloat m_yRotate;
   QPoint  m_ptPosition;
 
protected:
   virtual void   initializeGL   (                       );
   virtual void   resizeGL       (int nWidth, int nHeight);
   virtual void   paintGL        (                       );
   virtual void   mousePressEvent(QMouseEvent* pe        );
   virtual void   mouseMoveEvent (QMouseEvent* pe        );
   GLuint createPyramid  (GLfloat fSize = 1.0f   );
 
public:
   OGLPyramid(QWidget* pwgt = 0);
};
 
#endif // OGLPYRAMID_H
 

OGLPyramid.cpp
Код
C++ (Qt)
#include <QtGui>
#include "OGLPyramid.h"
 
// ----------------------------------------------------------------------
OGLPyramid::OGLPyramid(QWidget* pwgt/*= 0*/) : QGLWidget(pwgt)
 , m_xRotate(0)
 , m_yRotate(0)
{
}
 
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::initializeGL()
{
   qglClearColor(Qt::black);
   glEnable(GL_DEPTH_TEST);
   glShadeModel(GL_FLAT);
   m_nPyramid = createPyramid(1.2f);
}
 
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::resizeGL(int nWidth, int nHeight)
{
   glViewport(0, 0, (GLint)nWidth, (GLint)nHeight);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10.0);
}
 
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::paintGL()
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef(0.0, 0.0, -3.0);
 
   glRotatef(m_xRotate, 1.0, 0.0, 0.0);
   glRotatef(m_yRotate, 0.0, 1.0, 0.0);
 
   glCallList(m_nPyramid);
}
 
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::mousePressEvent(QMouseEvent* pe)
{
   m_ptPosition = pe->pos();
}
 
// ----------------------------------------------------------------------
/*virtual*/void OGLPyramid::mouseMoveEvent(QMouseEvent* pe)
{
   m_xRotate += 180 * (GLfloat)(pe->y() - m_ptPosition.y()) / height();
   m_yRotate += 180 * (GLfloat)(pe->x() - m_ptPosition.x()) / width();
   updateGL();
 
   m_ptPosition = pe->pos();
}
 
// ----------------------------------------------------------------------
GLuint OGLPyramid::createPyramid(GLfloat fSize/*=1.0f*/)
{
   GLuint n = glGenLists(1);
 
   glNewList(n, GL_COMPILE);
   glBegin(GL_TRIANGLE_FAN);
   qglColor(Qt::green);
   glVertex3f(0.0, fSize, 0.0);
   glVertex3f(-fSize, -fSize, fSize);
   glVertex3f(fSize, -fSize, fSize);
   qglColor(Qt::yellow);
   glVertex3f(fSize, -fSize, -fSize);
   qglColor(Qt::blue);
   glVertex3f(-fSize, -fSize, -fSize);
   qglColor(Qt::white);
   glVertex3f(-fSize, -fSize, fSize);
   glEnd();
 
   glBegin(GL_QUADS);
   qglColor(Qt::red);
   glVertex3f(-fSize, -fSize, fSize);
   glVertex3f(fSize, -fSize, fSize);
   glVertex3f(fSize, -fSize, -fSize);
   glVertex3f(-fSize, -fSize, -fSize);
   glEnd();
   glEndList();
 
   return n;
}
 
« Последнее редактирование: Март 28, 2014, 06:52 от 8Observer8 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Март 28, 2014, 06:59 »

Почитайте про glMatrixMode. Да и вообще по opengl.

А конкретно в этом случае достаточно по сети передавать m_xRotate и m_yRotate.
Записан
8Observer8
Гость
« Ответ #6 : Март 28, 2014, 07:07 »

Почитайте про glMatrixMode. Да и вообще по opengl.
Когда-то давно нашёл книгу "OpenGL. СуперКнига" (третье издание на русском). Но в ней очень сложно написано, и она очень толстая. Посоветуйте, пожалуйста, что-нибудь простое с большим количеством примеров Улыбающийся

А конкретно в этом случае достаточно по сети передавать m_xRotate и m_yRotate.
Огромное спасибо! Буду передавать m_xRotate и m_yRotate Улыбающийся Как мне это в голову не пришло Улыбающийся
« Последнее редактирование: Март 28, 2014, 07:14 от 8Observer8 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Март 28, 2014, 07:13 »

Когда-то давно нашёл книгу "OpenGL. СуперКнига" (третье издание на русском). Но в ней очень сложно написано, и она очень толстая. Посоветуйте, пожалуйста, что-нибудь простое с большим количеством примеров Улыбающийся

Не посоветую. Слишком давно я интересовался этой темой. Но гугл, я уверен, вам легко поможет. Улыбающийся

Add: придумайте/найдите интересный для вас большой проект, не занимайтесь ерундой. Подмигивающий
« Последнее редактирование: Март 28, 2014, 07:15 от Old » Записан
8Observer8
Гость
« Ответ #8 : Март 28, 2014, 07:17 »

Спасибо! Думаю, тему литературы по OpenGL действительно лучше здесь не развивать Улыбающийся

Add: придумайте/найдите интересный для вас большой проект, не занимайтесь ерундой. Подмигивающий
Я сейчас именно этим и занимаюсь Улыбающийся, то есть придумываю и ищу проект. Я хочу объединить OpenGL и сеть. Не знаю, во что это может выльеться. Мне интересна сеть, сбор данных и визуализация данных с помощью 3D графики. Если Вы мне подкинете пищу для размышлений - я буду только рад! Можно и в этой теме. Я её не буду закрывать Улыбающийся
« Последнее редактирование: Март 28, 2014, 07:31 от 8Observer8 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Март 28, 2014, 10:01 »

Координаты у него задаются один раз при создании пирамиды:
Это часто называют "модельные" координаты. Вообще есть "система координат" - это 3 оси, часто взаимо-перпендикулярные (ортогональные) но не обязательно. Сами оси меряются в "мировой" системе координат, которая может быть левой или правой - как условились. Направление мировых осей тоже условно. Обычно Y идет вверх, но у AutoDesk это Z. Переход из одной системы координат в другую выполняется с помощью матрицы (даже фильм такой был  Улыбающийся). Все линейные операции (сдвиг, поворот, масштаб) описываются матрицей. OpenGL тоже понимает матрицы (хоть и сделано там через задницу). Поэтому не нужно всякий раз менять исходные координаты - достаточно изменить матрицу(ы)

А вот как потом до них добраться? Есть ли способ получения координат в любой момент времени? Скорее всего, мне нужно будет передавать координаты, когда происходит событие mouseMoveEvent().
Нет. Исходные (модельные) координаты передаете 1 раз, а для каждого поворота - матрицу.

Я сейчас именно этим и занимаюсь Улыбающийся, то есть придумываю и ищу проект. Я хочу объединить OpenGL и сеть. Не знаю, во что это может выльеться. Мне интересна сеть, сбор данных и визуализация данных с помощью 3D графики. Если Вы мне подкинете пищу для размышлений - я буду только рад! Можно и в этой теме. Я её не буду закрывать Улыбающийся
Сеть, OpenGL - все это популярно, но обычно это приложение/прибамбасы к задаче (пусть нужные). А задач 3D у меня море, до многого руки не доходят. Вот только вряд ли Вы будете рады таким задачам - там работать надо, это не в СУБД керосин заливать  Улыбающийся
Записан
carrygun
Гость
« Ответ #10 : Март 28, 2014, 10:16 »

Если Вы мне подкинете пищу для размышлений - я буду только рад! Можно и в этой теме. Я её не буду закрывать Улыбающийся

Сделать такое же, только LGPL.
Записан
8Observer8
Гость
« Ответ #11 : Март 28, 2014, 14:44 »

Если Вы мне подкинете пищу для размышлений - я буду только рад! Можно и в этой теме. Я её не буду закрывать Улыбающийся
Сделать такое же, только LGPL.
О, совсем свежая статья. Пара дней ей. Интересно. Думаю, в будущем может пригодиться. Спасибо! Улыбающийся

Igors, спасибо большое! Где про эти матрицы хорошо написано? Не попадалось Вам хорошей литературы для новичков? Я думаю, ничего плохого не будет если Вы в этой теме поделитесь ссылками на ресурсы и названиями книг Улыбающийся Я, конечно, гуглил. NeHe, например, нашёл. С чего начать? Мне очень интересна тема OpenGL.

« Последнее редактирование: Март 28, 2014, 14:46 от 8Observer8 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Март 28, 2014, 15:15 »

Где про эти матрицы хорошо написано? Не попадалось Вам хорошей литературы для новичков? Я думаю, ничего плохого не будет если Вы в этой теме поделитесь ссылками на ресурсы и названиями книг Улыбающийся
А я их никогда и не читал. Когда-то (давно) мне попались исходники SDK с объяснениями типа тех что я дал выше, вот и все.

С чего начать? Мне очень интересна тема OpenGL.
Одна из самых гнусных вещей которой мне не удается избежать. Творчества ноль, тупое запоминание огромного числа ф-ций и столь же тупое переписывание примеров. OpenGL - всего лишь "визуализация" и то "с оглядкой на железо". Что бум визуализировать? И зачем? Откуда возьмутся модели, анимации, шейдинг и многое другое? Увлекающиеся OpenGL обычно не знают ответа на эти простые вопросы
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #13 : Март 28, 2014, 21:17 »

С чего начать? Мне очень интересна тема OpenGL.
Например, с вот этого tutorial.
Записан
8Observer8
Гость
« Ответ #14 : Март 28, 2014, 21:22 »

С чего начать? Мне очень интересна тема OpenGL.
Например, с вот этого tutorial.

Спасибо большое! А есть ли туториалы для новичков с ориентацией на Qt?
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.328 секунд. Запросов: 22.