LINUX.ORG.RU

Qt и OpenGL


0

0

Здравствуйте!
Есть такая задача: "Разработать диалоговую программу просмотра 3D сцены,заданной в виде полигональной модели и дерева построения.
При просмотре дожно присутсвовать задание позиции наблюдателя задание позиции наблюдателя.(перспективная проекция, однотонная
закраска многоугольников результирующей сцены при просмотре)."

В качестве инструментария я выбрал Qt + QtOpenGL module. Хотелось бы узнать ваше мнение о корректности такого выбора. Так же меня _очень_ интересуют ссылки с текстами о работе с 3d сценами, а еще лучше с примерами. Ибо программирование компьютерной графики не увлекаюсь, а надо.

Спасибо.


P.S. Qt выбрал руководствуясь следующим:
-- программировать буду под линуксом, запускать для демонстрации в форточках
-- удобное и быстрое создание GUI

anonymous

> Qt + QtOpenGL module.
Нормальный выбор. Но для такой простой задачи я бы использовал Glut.

> _очень_ интересуют ссылки с текстами о работе с 3d сценами,
для твоей задачи этих ссылок должно хватить:
http://opengl.org
http://nehe.gamedev.net 

aton
()

> -- удобное и быстрое создание GUI

А чем GLUT не подходит ? Вроде тоже кроссплатформенная библиотека.

begin.c:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

#include <pthread.h> // pthread_create()
#include <unistd.h>  // usleep()

#define TRUE 1
unsigned int FPS = 0;
double angle = 0;

void reshapeWindow(int w, int h) {
  // настройка системы координат
  glViewport (0,0,800,800);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(60.0,1.0,0.5,120.0);
  glMatrixMode(GL_MODELVIEW);
}

void drawCube(float size) {
  glBegin(GL_QUADS);
    glColor4f(0.25,0.75,0.25,0.0);
    glVertex3f(-size,-size,-size);
    glVertex3f(size,-size,-size);
    glVertex3f(size,-size,size);
    glVertex3f(-size,-size,size);

    glColor4f(0.30,0.30,0.30,0.0);
    glVertex3f(-size,-size,-size);
    glVertex3f(size,-size,-size);
    glVertex3f(size,size,-size);
    glVertex3f(-size,size,-size);

    glColor4f(0.35,0.75,0.75,0.0);
    glVertex3f(size,-size,-size);
    glVertex3f(size,size,-size);
    glVertex3f(size,size,size);
    glVertex3f(size,-size,size);

    glColor4f(0.40,0.40,0.40,0.0);
    glVertex3f(-size,-size,size);
    glVertex3f(size,-size,size);
    glVertex3f(size,size,size);
    glVertex3f(-size,size,size);

    glColor4f(0.75,0.45,0.45,0.0);
    glVertex3f(-size,-size,-size);
    glVertex3f(-size,-size,size);
    glVertex3f(-size,size,size);
    glVertex3f(-size,size,-size);

    glColor4f(0.50,0.50,0.50,0.0);
    glVertex3f(-size,size,-size);
    glVertex3f(size,size,-size);
    glVertex3f(size,size,size);
    glVertex3f(-size,size,size);
  glEnd();
}

void drawWindow() {

  int i,j,k;

  // рисование
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  GLfloat lightAmbient[] = {0.12,0.25,0.25,1.0};
  GLfloat lightDiffuse[] = {0.12,0.25,0.25,1.0};
  GLfloat lightPosition[] = {-15.0,15.0,-15.0,0.0};
  glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
  glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
  glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
  glEnable(GL_LIGHT0);
  glEnable(GL_LIGHTING);

  glDisable(GL_BLEND);
  glDisable(GL_ALPHA_TEST);

  glPolygonMode(GL_FRONT, GL_FILL);
  glShadeModel(GL_SMOOTH);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_COLOR_MATERIAL);
  glColorMaterial(GL_FRONT,GL_EMISSION);

  glLoadIdentity();
  gluLookAt(2.0,2.0,2.0, 0.0,0.0,0.0, 0.0,1.0,0.0);

  for (i = 0; i < 10; i++) {
    for (j = 0; j < 10; j++) {
      for (k = 0; k < 10; k++) {
        glPushMatrix();
        glTranslated(i-15,j-15,k-15);
        glRotatef(angle,1.0,1.0,0.0);
        angle = angle+0.005;
//        glutSolidCube(0.75);
        drawCube(0.5);
        glPopMatrix();
      }
    }
  }
  glFlush();
  glutSwapBuffers();
}

void idle () {
  FPS++;
  glutPostRedisplay();
}

void keyWindow (unsigned char k, int x, int y) {
  switch (k) {
    case 0x1B : exit(0);
  }
}

void visibleWindow (int v) {
  if (v == GLUT_VISIBLE) glutIdleFunc(idle);
  else glutIdleFunc(NULL);
}

void *printFPS (void *p) {
  while (TRUE) {
    printf ("%d\n",FPS);
    usleep(1000*1000);
  }
}

int main (int argc, char **argv) {

  pthread_t threadprintFPS;

  // инициализация нити
  pthread_create (&threadprintFPS,NULL,printFPS,NULL);

  // инициализация библиотеки
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB);

  // создание окна
  glutInitWindowPosition(0, 0);
  glutInitWindowSize(800,800);
  glutCreateWindow("vm");

  // настройка обработчиков событий
  glutDisplayFunc(drawWindow);
  glutReshapeFunc(reshapeWindow);
  glutVisibilityFunc(visibleWindow);
  glutKeyboardFunc(keyWindow);

  glutMainLoop();
}

Makefile:
NAME=begin
${NAME}:        ${NAME}.c
                gcc -lGL -lGLU -lglut -lpthread -o ${NAME} ${NAME}.c
                strip --strip-all ${NAME}
                upx ${NAME}
edit:           ${NAME}.c
                vi ${NAME}.c
html:           ${NAME}.c
                vim -n -c ':so /usr/share/vim/vim63/syntax/2html.vim' -c ':wqa' ${NAME}.c

pacify ★★★★★
()

Ok, спасибо за советы. Тогда, действительно, попробую поработать с libGlut.

anonymous
()
Ответ на: комментарий от redvasily

> glut дрянь. С ним всегда проблемы. Если тебе нужно сделать кнопочку, нарисовать формочку, то glut тебе не поможет.

Ладно, тогда поставим вопрос несколько по-другому: для Python существуют подобные библиотеки/биндинги, которые удовлетворяют этим требованием; особенно работе с 3d сценами?

anonymous
()
Ответ на: комментарий от anonymous

Да. (wxPython или PyQt) + PyOpenGL

Но OpenGL это хреновина весьма низкого уровня. Может тебе посмотреть тогда на Ogre3d, для него есть питоновский байндинг. Видел ещё панду от диснея (3d движок для питона).

Хотя если графика нужна простенькая, то может вообще имеет смысл использовать cgkit

redvasily
()
Ответ на: комментарий от redvasily

> Хотя если графика нужна простенькая, то может вообще имеет смысл использовать cgkit

Спасибо, самая менее монстрообразная штука, imho :). Правда тоже довольно высокоуровневая, что может не понравится преподу. А ковырятся с OpenGL в том виде, какой он есть -- у меня нет не единого желания, ибо комп. графикой не интересуюсь и программирую совершенно в другом русле.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.