На главную Наши проекты:
Журнал   ·   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
Страницы: (4) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> Реализация координатной сетки OpenGL
    Доброго времени суток!

    Начал изучать OpenGL...

    Вопрос к приемеру есть сетка:
    ExpandedWrap disabled
      void _DrawGrid(float cx, float cy, float step)
          {
              float _cx = cx / 2;
              float _cy = cy / 2;
       
              for(float x = -_cx; x <= _cx; x += step)
              {
                  glBegin(GL_LINES);
                  glVertex3f(x, _cy, 0.0);
                  glVertex3f(x, -_cy, 0.0);
                  glEnd();
              }
       
              for(float y = -_cy; y <= _cy; y += step)
              {
                  glBegin(GL_LINES);
                  glVertex3f(_cx, y, 0.0);
                  glVertex3f(-_cx, y, 0.0);
                  glEnd();
              }
          }


    Или что-то в этом роде центр сетки 0,0,0
    далее рисуется куб:
    ExpandedWrap disabled
      void _DrawCube(GLfloat size)
          {
              glBegin(GL_QUADS);
              // левая грань
              glVertex3f( -size / 2, -size / 2, -size / 2);
              glVertex3f( -size / 2,  size / 2, -size / 2);
              glVertex3f( -size / 2,  size / 2,  size / 2);
              glVertex3f( -size / 2, -size / 2,  size / 2);
              // правая грань
              glVertex3f(  size / 2, -size / 2, -size / 2);
              glVertex3f(  size / 2, -size / 2,  size / 2);
              glVertex3f(  size / 2,  size / 2,  size / 2);
              glVertex3f(  size / 2,  size / 2, -size / 2);
              // нижняя грань
              glVertex3f( -size / 2, -size / 2, -size / 2);
              glVertex3f( -size / 2, -size / 2,  size / 2);
              glVertex3f(  size / 2, -size / 2,  size / 2);
              glVertex3f(  size / 2, -size / 2, -size / 2);
              // верхняя грань
              glVertex3f( -size / 2, size / 2, -size / 2);
              glVertex3f( -size / 2, size / 2,  size / 2);
              glVertex3f(  size / 2, size / 2,  size / 2);
              glVertex3f(  size / 2, size / 2, -size / 2);
              // задняя грань
              glVertex3f( -size / 2, -size / 2, -size / 2);
              glVertex3f(  size / 2, -size / 2, -size / 2);
              glVertex3f(  size / 2,  size / 2, -size / 2);
              glVertex3f( -size / 2,  size / 2, -size / 2);
              // передняя грань
              glVertex3f( -size / 2, -size / 2,  size / 2);
              glVertex3f(  size / 2, -size / 2,  size / 2);
              glVertex3f(  size / 2,  size / 2,  size / 2);
              glVertex3f( -size / 2,  size / 2,  size / 2);
              glEnd();
          }


    центр куба тоже 0,0,0

    все это дело отрисовывается в методе:
    ExpandedWrap disabled
              // ....
              glPushMatrix();
       
              // далее позиция и поворот меняются мышью...
          glTranslated(0.0, 0.0, m_RenderParams.Position.z);
          glRotatef(m_RenderParams.Rotation.x, 1, 0, 0);
          glRotatef(m_RenderParams.Rotation.y, 0, 1, 0);
          glRotatef(m_RenderParams.Rotation.z, 0, 0, 1);
       
          _DrawGrid(50.0, 50.0, 0.0);
          _DrawCube(10.0);
       
       
          glPopMatrix();
          glFlush();
              // ....


    Собственно вопрос... выводится все правильно и сетка в центре и куб, но только при вращении сцены - куб сам по себе, секта - сама, короче говоря как выводить
    объекты (в данном случае куб) с привязкой к сетке т.е. если шаг сетки равен, к примеру, 10, то при отрисовке куба с гранью 20, в центре он должен занять ровно
    4-ре ячейки и при вращении/маштабировании вершины куба должны быть привязаны к координатной сетке т.е. как в любом 3D редакторе (3DS Max) и т.д.
      Не понял, в чем вопрос? Как сделать чтобы сетк вращалась отдельно? Если так, то сделай примерно так:

      ExpandedWrap disabled
           glTranslated(0.0, 0.0, m_RenderParams.Position.z);
         
           glPushMatrix();  
           glRotatef(gridRotation.x, 1, 0, 0);
           glRotatef(gridRotation.y, 0, 1, 0);
           glRotatef(gridRotation.z, 0, 0, 1);
           _DrawGrid(50.0, 50.0, 0.0);
          
           glPopMatrix();
           glPushMatrix();
           glRotatef(cubeRotation.x, 1, 0, 0);
           glRotatef(cubeRotation.y, 0, 1, 0);
           glRotatef(cubeRotation.z, 0, 0, 1);
           _DrawCube(50.0);
           glPopMatrix();
        To OpenGL, нет, наоборот так чтобы сетка и куб вращались вместе т.е. куб должен быть в координатах сетки (вершины куба), а сей час..., хотя сетка и куб рисуются с координатами центра 0,0,0 но при вращении куб ведет себя как бы отдельно...

        На рисунке видно, что (1) вид сбоку - нормально, (2) вид сверху - нормально, но при вращении (3) - как будто он (куб) выше сетки (а он должен быть на половину выше (т.к. центры у них совпадают), на (4) - как будто он на краю сетки, хотя он должен быть в центре...

        Т.е. куб при вращении ползает по сетке, а должен быть в заданной позиции (в данном случае в центре).[attach=#0][/attach]
          Картинку не увидел, но по описанию похоже что ты не включил depth test. Попробуй:
          ExpandedWrap disabled
            //при инициализации
            glEnable(GL_DEPTH_TEST);
             
            //при рисовании
            glClear(GL_DEPTH_BUFFER_BIT);
            Во... даже .rar не прикрепляется (c .exe). Попробую объяснить на пальцах... короче говоря куб при вращении сцены как будто ползает по сетке, а должен быть как монолит, т.е. жестко привязан к координатам сетки...

            Как это реализовать или где посмотреть исходник самого простого 3D редактора?

            Добавлено
            glEnable(GL_DEPTH_TEST) - есть такое дело... дело не в этом... такое впечатление, что куб должен маштабироваться отдельно...

              Может тогда весь код покажешь?
              Цитата Sergey Bogoyavlenskiy @
              такое впечатление, что куб должен маштабироваться отдельно...

              При чем здесь масштабирование, мы же вроде о вращении говорили...

              Цитата Sergey Bogoyavlenskiy @
              где посмотреть исходник самого простого 3D редактора?

              Дома был, вечером возможно выложу.
                Про Прикрепление файла... все равно не могу... не крепит и всё тут... ни .jpeg ни .rar файл выбирается, но как его крепить?
                Если после выбора делать предпросмотр, то файла нет, если нажать на [attach] то в сообщении появляетя [attach=#0][/attach]...
                а файла нет. А так я бы и код выложил и .exe в .rar и картинки... на счет кода то он разбит по классам, но принцип такой при обработке перемещения мыши изменяются

                m_RenderParams.Position (три float x, y, z), а также аналогично m_RenderParams.Rotation (x, y, z) далее, до начала отрисовки:

                ExpandedWrap disabled
                          // ....
                          glPushMatrix();
                   
                          // далее позиция и поворот меняются мышью...
                      glTranslated(0.0, 0.0, m_RenderParams.Position.z); // колесо мыши ближе/дальше
                      glRotatef(m_RenderParams.Rotation.x, 1, 0, 0);
                      glRotatef(m_RenderParams.Rotation.y, 0, 1, 0);
                      glRotatef(m_RenderParams.Rotation.z, 0, 0, 1);
                   
                      _DrawGrid(50.0, 50.0, 5.0);
                      _DrawCube(10.0);
                   
                   
                      glPopMatrix();
                      glFlush();
                          // ....


                код отрисовки куба и сетки выше... рисуются они с центром в 0,0,0. Но я так думал, что glTranslated() и glRotatef() должны действовать на все одинаково, т.е. и на сетку и на куб, отрисовываются они действительно в центре, но при вращении сцены создается впечатление что куб "гуляет"
                сетке... т.е. они не выглядят как сцена в том же 3DS Max, вроде они вращаются, маштабируются но как бы это сказать... каждый по свойму... нет ощущения единой сцены...
                  Все-таки что-то мне подсказывает что дело в depth test :) Попробуй поменять вызов рисования сетки и куба местами и посмотри что получится.
                    поменял, но все один к одному... возможно если двигать камеру то все было бы в порядке, но многие пишут, что разницы между (изменением положения камеры относительно сцены и изменением положения сцены относительно камеры) принципиальной нет. Вот просто представьте себе куб на плоскости (в центре) когда мы смотрим сверху то все нормально, но мы начинаем вращать пусть даже по одной оси, к примеру, от себя (пока сетка(плоскость) не станет одной линией) куб как бы должен сдвигаться назад к центру сетки(плоскости), а он рисуется, хотя и тоже вращается вместе с сеткой, в центре экрана, а не в центре сетки... Извините, но лучше объяснить у меня не получается.

                      То есть, куб всегда у тебя рисуется выше/впереди сетки?
                        Цитата Sergey Bogoyavlenskiy @
                        Про Прикрепление файла... все равно не могу... не крепит и всё тут... ни .jpeg ни .rar файл выбирается, но как его крепить?
                        Если после выбора делать предпросмотр, то файла нет, если нажать на [attach] то в сообщении появляетя [attach=#0][/attach]...
                        а файла нет.

                        Тег attach выполняет несколько другую функцию, он позволяет указать, в каком месте поста его выводить, а так же позволяет задать свое пояснение
                        Что бы прикрепить файл, его достаточно просто выбрать, и нажать "Отправить"
                          Пробую прикрепить файл...

                          Прикреплённый файлПрикреплённый файлMFC_Project.rar (19,21 Кбайт, скачиваний: 218)

                          Добавлено
                          Прикрепил! :D
                            Может лучше исходники выложишь? Здесь у меня MSVCR80.dll не установлена :)
                              Вот что-то в этом роде, за качество кода извините, но суть думаю будет понятна...

                              Прикреплённый файлПрикреплённый файлMFC_Project_3D_Camera_Scene.rar (58,75 Кбайт, скачиваний: 281)

                              Добавлено
                              Ну, с этим ладно, в принципе работает да и ладно, но возник еще один вопрос, изначально выводится сетка, затем куб, когда оно серое то особо не заметно, но когда установил различные цвета (для сетки и для куба) то происходит мерцание сетки на кубе при вращении как с этим бороться или это уже зависит от видеокарты?
                                Мерцание сетки вызвано тем, что она идет точь-в-точь по грани и в тех местах из-за погрешностей получается больше то одна величина, то другая. А с первой проблемой не понял - у меня все рисуется как надо.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0421 ]   [ 19 queries used ]   [ Generated: 28.03.24, 16:59 GMT ]