На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Прошу пример минимальной рабочей программы по OpenGL. , Требуется пример рабочей программы по OpenGL для работы с квадра буфером.
    У меня аналогичная программа плохо работает:
    Неправдоподобное отображение за счёт неправильных значений для проекций и камер левого и правого глаз.

    Ошибки в цифрах этого кода:
    ExpandedWrap disabled
      GLdouble Xmin = -150.0;
      GLdouble Xmax = 150.0;
      GLfloat eyeOffset = GLfloat(Xmax-Xmin)*0.035f*2.0f;
      GLdouble FrustumAssymmetry = 0.01*eyeOffset/(Xmax-Xmin)*2.0f;
      GLfloat PULL_BACK = 0.0f;
       
       
      ///////////////////////////////// RENDER SCENE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
      /////
      /////   This function renders the entire scene.
      /////
      ///////////////////////////////// RENDER SCENE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*
       
      void RenderScene()
      {
      //  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
       
      //*/
          glDrawBuffer(GL_BACK_LEFT);
       
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
       
          
          // Setup the frustum for the left eye
          glMatrixMode(GL_PROJECTION);
          glLoadIdentity();
          glFrustum(Xmin - FrustumAssymmetry,
              Xmax - FrustumAssymmetry,
              -0.75, 0.75, 0.65, 4.0);
          glTranslatef(eyeOffset, 0.0f, 0.0f);
      //*/
       
          glMatrixMode(GL_MODELVIEW);
       
          glLoadIdentity();                                   // Reset The matrix
       
          // Tell OpenGL where to point the camera
          g_Camera_left.Look();
       
          //bool clear_current_sector = false;
          
          Draw3DFloor(back_left);
       
          Draw3DWalls(back_left);
       
          Draw3DRoof(back_left);
       
       
          glDrawBuffer(GL_BACK_RIGHT);
       
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
       
          
          // Setup the frustum for the right eye.
          glMatrixMode(GL_PROJECTION);
          glLoadIdentity();
          glFrustum(Xmin + FrustumAssymmetry,
              Xmax + FrustumAssymmetry,
              -0.75, 0.75, 0.65, 4.0);
          glTranslatef(-eyeOffset, 0.0f, 0.0f);
          glTranslatef(0.0f, 0.0f, -PULL_BACK);
          
       
          glMatrixMode(GL_MODELVIEW);
       
          glLoadIdentity();                                   // Reset The matrix
       
          // Tell OpenGL where to point the camera
          g_Camera_right.Look();
       
          Draw3DFloor(back_right);
       
          Draw3DWalls(back_right);
       
          Draw3DRoof(back_right);
      //*/
          // Swap the backbuffers to the foreground
          SwapBuffers(g_hDC);
      }


    Ошибки в константах в верхней части кода.

    На рисунке расстояние между стенами 4*25.
    Реально это порядка 25 метров.
    А из констант вроде бы выходит, что расстояние между глазами (камерами) примерно 150/4 метров.
    150 ярдов - значение, при котором есть адекватная картинка.
    Расстояние между потолком и полом, которого не видно, 10 ярдов (2.5 метра).
    Прикреплённая картинка
    Прикреплённая картинка
    Сообщение отредактировано: Kozlov_Sergey -

        Вот посмотри мою программу.
        ftp://ftp.stl-galaxy.by/Games.rar

        Проблема именно в квадро буфере.
        Управление:
        W - вперёд
        S - назад
        A - влево
        D - вправо

        Проект на студии 11 (2012 года выпуска)
          посмотрел...

          вижу 4-5 разных функций рисования

          там просто надо отладить координаты,че хотел сделать этими розами и плоскостями?

          напутаны координаты,надо 25 раз отрегулиривать и перекомпилировать

          с самого начала идти ,закомменировать пару рисований и искать где эти 2 плоскости рисуются,и регулировать нормальное перемещение

          я не могу в таком составе перекомпилировать - ты архив дал без главного ярлыка,сам корень проекта не дал
            Вот главная функция рисования:
            ExpandedWrap disabled
              void RenderScene()
              {
              //  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
               
              //*/
                  glDrawBuffer(GL_BACK_LEFT);
               
                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
               
                  
                  // Setup the frustum for the left eye
                  glMatrixMode(GL_PROJECTION);
                  glLoadIdentity();
                  glFrustum(Xmin - FrustumAssymmetry,
                      Xmax - FrustumAssymmetry,
                      -0.75, 0.75, 0.65, 4.0);
                  glTranslatef(eyeOffset, 0.0f, 0.0f);
              //*/
               
                  glMatrixMode(GL_MODELVIEW);
               
                  glLoadIdentity();                                   // Reset The matrix
               
                  // Tell OpenGL where to point the camera
                  g_Camera_left.Look();
               
                  //bool clear_current_sector = false;
                  
                  Draw3DFloor(back_left);
               
                  Draw3DWalls(back_left);
               
                  Draw3DRoof(back_left);
               
                  //if(!g_sector)
                  //{
                  //  g_sector_number = 1;
                  //  g_sector = (SECTOR**)malloc(maximum_sector_number*sizeof(SECTOR*));
               
                  //  for(unsigned int sector_counter=0;sector_counter<maximum_sector_number;sector_counter++)
                  //  {
                  //      g_sector[sector_counter] = NULL;
                  //  }
               
                  //  if(g_sector_number<maximum_sector_number)
                  //  {
                  //          g_sector[g_sector_number] = Load3DSector("sector1.txt");
                  //  }
                  //}
               
                  //if(g_sector)
                  //{
                  //  if(g_sector_number<maximum_sector_number)
                  //  {
                  //      if(g_sector[g_sector_number])
                  //      {
                  //          Draw3DSector(g_sector[g_sector_number]);
                  //      }
                  //  }
                  //}
               
                  //if(g_sector && clear_current_sector)
                  //{
                  //  if(g_sector_number<maximum_sector_number)
                  //  {
                  //      if(g_sector[g_sector_number]->quads)
                  //          free(g_sector[g_sector_number]->quads);
                  //      free(g_sector[g_sector_number]);
                  //      g_sector[g_sector_number] = NULL;
                  //  }
                  //}
                  
                  // Draw the pyramids that spiral in to the center
                  //DrawSpiralTowers();
               
              //*/
                  glDrawBuffer(GL_BACK_RIGHT);
               
                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
               
                  
                  // Setup the frustum for the right eye.
                  glMatrixMode(GL_PROJECTION);
                  glLoadIdentity();
                  glFrustum(Xmin + FrustumAssymmetry,
                      Xmax + FrustumAssymmetry,
                      -0.75, 0.75, 0.65, 4.0);
                  glTranslatef(-eyeOffset, 0.0f, 0.0f);
                  glTranslatef(0.0f, 0.0f, -PULL_BACK);
                  
               
                  glMatrixMode(GL_MODELVIEW);
               
                  glLoadIdentity();                                   // Reset The matrix
               
                  // Tell OpenGL where to point the camera
                  g_Camera_right.Look();
               
                  Draw3DFloor(back_right);
               
                  Draw3DWalls(back_right);
               
                  Draw3DRoof(back_right);
              //*/
                  // Swap the backbuffers to the foreground
                  SwapBuffers(g_hDC);
              }


            Проблема здесь в цифрах и переменных:
            ExpandedWrap disabled
                  // Setup the frustum for the left eye
                  glMatrixMode(GL_PROJECTION);
                  glLoadIdentity();
                  glFrustum(Xmin - FrustumAssymmetry,
                      Xmax - FrustumAssymmetry,
                      -0.75, 0.75, 0.65, 4.0);
                  glTranslatef(eyeOffset, 0.0f, 0.0f);

            ExpandedWrap disabled
                  // Setup the frustum for the right eye.
                  glMatrixMode(GL_PROJECTION);
                  glLoadIdentity();
                  glFrustum(Xmin + FrustumAssymmetry,
                      Xmax + FrustumAssymmetry,
                      -0.75, 0.75, 0.65, 4.0);
                  glTranslatef(-eyeOffset, 0.0f, 0.0f);
                  glTranslatef(0.0f, 0.0f, -PULL_BACK);


            Добавлено
            Если закомментировать рисование для правого глаза, то нормально работает.

            Добавлено
            По этим плоскостям бегает камера.
            Как бы вид от первого лица.
            Там помещение из пола, стен и крыши.

            Розы - обои стен.
            Елочки - плитка пола и потолка.

            Добавлено
            И ещё есть 2 входа.

            Добавлено
            Вот так рисование в двойном буфера (без стерео 3D):

            ExpandedWrap disabled
              void RenderScene()
              {
                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
               
              /*/
                  glDrawBuffer(GL_BACK_LEFT);
               
                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
               
                  
                  // Setup the frustum for the left eye
                  glMatrixMode(GL_PROJECTION);
                  glLoadIdentity();
                  glFrustum(Xmin - FrustumAssymmetry,
                      Xmax - FrustumAssymmetry,
                      -0.75, 0.75, 0.65, 4.0);
                  glTranslatef(eyeOffset, 0.0f, 0.0f);
              //*/
               
                  glMatrixMode(GL_MODELVIEW);
               
                  glLoadIdentity();                                   // Reset The matrix
               
                  // Tell OpenGL where to point the camera
                  g_Camera_left.Look();
               
                  //bool clear_current_sector = false;
                  
                  Draw3DFloor(back_left);
               
                  Draw3DWalls(back_left);
               
                  Draw3DRoof(back_left);
               
                  //if(!g_sector)
                  //{
                  //  g_sector_number = 1;
                  //  g_sector = (SECTOR**)malloc(maximum_sector_number*sizeof(SECTOR*));
               
                  //  for(unsigned int sector_counter=0;sector_counter<maximum_sector_number;sector_counter++)
                  //  {
                  //      g_sector[sector_counter] = NULL;
                  //  }
               
                  //  if(g_sector_number<maximum_sector_number)
                  //  {
                  //          g_sector[g_sector_number] = Load3DSector("sector1.txt");
                  //  }
                  //}
               
                  //if(g_sector)
                  //{
                  //  if(g_sector_number<maximum_sector_number)
                  //  {
                  //      if(g_sector[g_sector_number])
                  //      {
                  //          Draw3DSector(g_sector[g_sector_number]);
                  //      }
                  //  }
                  //}
               
                  //if(g_sector && clear_current_sector)
                  //{
                  //  if(g_sector_number<maximum_sector_number)
                  //  {
                  //      if(g_sector[g_sector_number]->quads)
                  //          free(g_sector[g_sector_number]->quads);
                  //      free(g_sector[g_sector_number]);
                  //      g_sector[g_sector_number] = NULL;
                  //  }
                  //}
                  
                  // Draw the pyramids that spiral in to the center
                  //DrawSpiralTowers();
               
              /*/
                  glDrawBuffer(GL_BACK_RIGHT);
               
                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
               
                  
                  // Setup the frustum for the right eye.
                  glMatrixMode(GL_PROJECTION);
                  glLoadIdentity();
                  glFrustum(Xmin + FrustumAssymmetry,
                      Xmax + FrustumAssymmetry,
                      -0.75, 0.75, 0.65, 4.0);
                  glTranslatef(-eyeOffset, 0.0f, 0.0f);
                  glTranslatef(0.0f, 0.0f, -PULL_BACK);
                  
               
                  glMatrixMode(GL_MODELVIEW);
               
                  glLoadIdentity();                                   // Reset The matrix
               
                  // Tell OpenGL where to point the camera
                  g_Camera_right.Look();
               
                  Draw3DFloor(back_right);
               
                  Draw3DWalls(back_right);
               
                  Draw3DRoof(back_right);
              //*/
                  // Swap the backbuffers to the foreground
                  SwapBuffers(g_hDC);
              }


            Добавлено
            И еще надо отключить
            ExpandedWrap disabled
               | PFD_STEREO

            В

            ExpandedWrap disabled
              bool bSetupPixelFormat(HDC hdc)
               
              pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_STEREO;


            Добавлено
            Корневой каталог: Year.

            Вот проект без стерео (закомметированно стерео):
            ftp://ftp.stl-galaxy.by/Year_without_stereo_3d.rar
            Сообщение отредактировано: Kozlov_Sergey -
              Прикреплённая картинка
              Прикреплённая картинка


              Добавлено
              Ты работал раньше с квадро буфером?

              Добавлено
              Куда-то делось руководство по программированию 3D Stereo.

              Искал по словам "NVIDIA 3D Vision Stereo OpenGL presentation".
              Безрезультатно.

              В общем что-то с цифрами при работе с матрицей проекций.

              Какие проблемы при построении проекта?

              Добавлено
              Хотел сделать программу, в которой можно ходить по моему городу по всем зданиям, заходить в каждое здание и смотреть, что там есть: "Виртуальная копия города".

              Например для экскурсий или для игр разных.

              Добавлено
              Это моя идея: "Все права защищены © STL Galaxy. 2004"
                XSB-M
                Ты пробуешь мою программу с квадра буфером подправить?
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0804 ]   [ 19 queries used ]   [ Generated: 25.04.24, 04:55 GMT ]