На главную Наши проекты:
Журнал   ·   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 4  все  ( Перейти к последнему сообщению )  
> Реализация координатной сетки OpenGL
    Проблема была не с OpenGL а с видеокартой, (на работе встроеная) дома - все OK. Но про мерцание сетки не понял... У меня это выглядит так, как будто куб - частично прозрачный т.е. в зависимости от поворота через него видно сетку или ее часть.
      Видна именно та часть сетки, которая должна быть внутри куба, или лежащая на его гранях? Если второе, то так и должно быть.
        Вот картинка...

        Прикреплённая картинка
        Прикреплённая картинка


        Добавлено
        Исходники те же, только разные цвета для сетки и куба.

        Добавлено
        Причем, это не только с кубом, даже если поверх сетки выводить плоскость

        ExpandedWrap disabled
          void _DrawPlane(POINT3D pos, float cx, float cy)
              {
                  glBegin(GL_POLYGON);
                  glVertex3f(pos.x - cx / 2, pos.y + cy / 2, pos.z);
                  glVertex3f(pos.x + cx / 2, pos.y + cy / 2, pos.z);
                  glVertex3f(pos.x + cx / 2, pos.y - cy / 2, pos.z);
                  glVertex3f(pos.x - cx / 2, pos.y - cy / 2, pos.z);
                  glEnd();
              }


        плоскость лежит сверху на приличной высоте над сеткой, но при вращении эффект тот же, части сетки (линии) мерцают при вращении т.е. отрисовываются поверх плоскости.
          Скриншот выглядит довольно загадочно :unsure: Такой эффект повторяется на многих компах?
          Сейчас на работе, смогу запустить код только дома.
            Пробавл на 3-х, правда, на всех Windows 7. Но скорее всего причина в другом...
              Вот еще рисунок на 1-м красная плоскость намного выше зеленной, но ее часть закрашивается зеленым (мерцает при повороте).
              На втором красная плоскость (квадрат) находится за зеленной! Но она также мерцает т.е. прокрашивается... при поворотах.

              Прикреплённая картинка
              Прикреплённая картинка


              Добавлено
              что то с depth test т.к. если вызвать glDisable(GL_DEPTH_TEST); между отрисовками плоскостей то мерцание исчезает, правда рисуется нормально только на первый взглад... до поворота на 180...
                У тебя во многих местах вызывается hDC=GetDC(...); Скорей всего, проблема в этом - у меня сначала вылезали непонятные баги, но после удаления этих строк все стало нормально. На всякий случай прикладываю архив того, что у меня получилось.
                Архив, только исходникиПрикреплённый файлMFC_Project.rar (10,59 Кбайт, скачиваний: 154)
                  Спасибо, но возник еще вопрос, задумал я отрисовать в левом нижнем углу вектора направления осей (X, Y, Z) вот (в одном из примеров "нарыл"):

                  ExpandedWrap disabled
                    void CRender::DrawAxis(HWND hWnd)
                    {
                        RECT rcClient;
                        ::GetClientRect(hWnd, &rcClient);
                     
                        float aspect = (float)(rcClient.right - rcClient.left) / (float)(rcClient.bottom - rcClient.top);
                     
                        int nSize = 50;
                        SIZE szViewPort;
                        if (aspect > 1) // width > height
                        {
                            szViewPort.cx = nSize * aspect;
                            szViewPort.cy = nSize;
                        }
                        else
                        {
                            szViewPort.cx = nSize;
                            szViewPort.cy = nSize / aspect;
                        }
                     
                        glViewport(0, 0, szViewPort.cx, szViewPort.cy);
                     
                        glPushAttrib(GL_ENABLE_BIT);
                        glDisable(GL_DEPTH_TEST);
                        glDisable(GL_LIGHTING);
                        glLineWidth(1.0);
                     
                        //glOrtho(-1.0, 1.0, -1.0, 1.0, 0.5, 1);
                        //----------------------------------------------
                        float fLength = 10.0;
                        POINT3D pt(0.0, 0.0, 0.0);
                     
                        glBegin(GL_LINES);
                        glVertex3f(pt.x, pt.y, pt.z);
                        glVertex3f(pt.x + fLength, pt.y, pt.z);
                        glEnd();
                     
                        glBegin(GL_LINES);
                        glVertex3f(pt.x, pt.y, pt.z);
                        glVertex3f(pt.x, pt.y + fLength, pt.z);
                        glEnd();
                     
                        glBegin(GL_LINES);
                        glVertex3f(pt.x, pt.y, pt.z);
                        glVertex3f(pt.x, pt.y, pt.z + fLength);
                        glEnd();
                     
                        //----------------------------------------------
                     
                        glPopAttrib();
                        glViewport(0,0, rcClient.right, rcClient.bottom);
                    }


                  Вот пока так примитивно, но возник вопрос следующего плана, при установке нового glViewport() его размеры должны быть с таким же соотношением сторон, как и
                  у окна, иначе они (вектора осей) рисуются неверно, но в таком случае этот новый вьюпорт постоянно ползает (меняет размеры) в соответствии с размерами окна и графика в нем (в данном случае это три отрезка) маштабируются. Вопрос возможно ли сделать эту зону статической и квадратной к примеру 50х50 у.е. и уже в ней рисовать вектора осей или...

                  P.S. Этот метод можно запихнуть в исходники выше, только надо пердать HWND окна.
                    У меня не рисуются оси твоей функцией :) Я ее немного поправил:
                    ExpandedWrap disabled
                      void CRender::DrawAxis(HWND hWnd)
                      {
                          RECT rcClient;
                          ::GetClientRect(hWnd, &rcClient);
                       
                          int nSize = 50;
                          SIZE szViewPort;
                          
                          szViewPort.cx = nSize;
                          szViewPort.cy = nSize;
                       
                       
                          glViewport(0, 0, szViewPort.cx, szViewPort.cy);
                       
                          glPushAttrib(GL_ENABLE_BIT);
                          glDisable(GL_DEPTH_TEST);
                          glDisable(GL_LIGHTING);
                          glLineWidth(1.0);
                       
                          glMatrixMode(GL_PROJECTION);
                          glPushMatrix();
                          glLoadIdentity();
                          glOrtho(-1.0, 1.0, -1.0, 1.0, -1, 1);
                          //----------------------------------------------
                          float fLength = 1.0;
                          POINT3D pt(0.0, 0.0, 0.0);
                       
                          glColor3f(0,0,1);
                       
                          glBegin(GL_LINES);
                          glVertex3f(pt.x, pt.y, pt.z);
                          glVertex3f(pt.x + fLength, pt.y, pt.z);
                       
                          glVertex3f(pt.x, pt.y, pt.z);
                          glVertex3f(pt.x, pt.y + fLength, pt.z);
                       
                          glVertex3f(pt.x, pt.y, pt.z);
                          glVertex3f(pt.x, pt.y, pt.z + fLength);
                          glEnd();
                       
                          //----------------------------------------------
                          glPopMatrix();
                          glMatrixMode(GL_MODELVIEW);
                          glPopAttrib();
                          glViewport(0,0, rcClient.right, rcClient.bottom);
                      }
                      Вот спасибо! Ну и еще, последний вопрос, дальше буду сам разбираться...
                      Видел много реализаций 3d объектов (реализаций на C++), но все расчитаны под 3ds max и т.д. А мне бы для начало что-нибудь попроще (что бы вникнуть), как правильно хранить вершины, ребра, плоскости. Так что бы в дальнейшем можно было осуществять их выбор и редактирование, пусть хотя бы только редактирование вершин...

                      Где такое можно подсмотреть?
                        Цитата Sergey Bogoyavlenskiy @
                        Видел много реализаций 3d объектов (реализаций на C++), но все расчитаны под 3ds max

                        При чем здесь 3d max? Библиотеки содержат инструменты, необходимые для загрузки, отображения и пр. дествий с 3D объектами.
                        Самое простое (и довольно универсальное решение) сделать так: объект - массив граней + информация о его повороте и положении, грань - массив вершин, вершина - координаты, цвет и нормаль.
                          Вот, вот!!! Нет, 3ds max здесь действительно не к месту, согласен, это я так для примера, а вот за массив граней и т.д. спасибо! Буду копать в этом направлении.
                            Вот и еще вопрос... ковырялся, googlil, но... Кроче говоря объектную модель сделал, все рисуется, все замечательно вершины упоковал в вектор и т.д. т.е. могу ходить по вершинам, по граням, по объектам, но теперь возник вопрос о выборе вершины мышью... нашел такой код:

                            ExpandedWrap disabled
                              class CVector3
                              {
                                public:
                                float x,y,z;
                              };
                               
                              void calc_select_line(int mouse_x, int mouse_y, CVector3& p1, CVector3& p2)
                              {
                                // mouse_x, mouse_y  - оконные координаты курсора мыши.
                                // p1, p2            - возвращаемые параметры - концы селектирующего отрезка,
                                //                     лежащие соответственно на ближней и дальней плоскостях
                                //                     отсечения.
                                GLint    viewport[4];    // параметры viewport-a.
                                GLdouble projection[16]; // матрица проекции.
                                GLdouble modelview[16];  // видовая матрица.
                                GLdouble vx,vy,vz;       // координаты курсора мыши в системе координат viewport-a.
                                GLdouble wx,wy,wz;       // возвращаемые мировые координаты.
                               
                                glGetIntegerv(GL_VIEWPORT,viewport);           // узнаём параметры viewport-a.
                                glGetDoublev(GL_PROJECTION_MATRIX,projection); // узнаём матрицу проекции.
                                glGetDoublev(GL_MODELVIEW_MATRIX,modelview);   // узнаём видовую матрицу.
                                // переводим оконные координаты курсора в систему координат viewport-a.
                                vx = mouse_x;
                                vy = height - mouse_y - 1; // где height - текущая высота окна.
                               
                                // вычисляем ближний конец селектирующего отрезка.
                                vz = -1;
                                gluUnProject(vx, vy, vz, modelview, projection, viewport, &wx, &wy, &wz);
                                p1 = CVector3(wx,wy,wz);
                                // вычисляем дальний конец селектирующего отрезка.
                                vz = 1;
                                gluUnProject(vx, vy, vz, modelview, projection, viewport, &wx, &wy, &wz);
                                p2 = CVector3(wx,wy,wz);
                              }


                            Но решил проверить что же все таки получиться... и начал его отрисовывать (полученный отрезок)... или я чего-то не понимаю... или луч рисуется от края экрана в центр сцены, т.к. при любом положении курсора p1 - по всем координатам около нуля, да и орезок как то не связан с координатами курсора (x, y). Так вот собственно и вопрос как правильно выбирать (тест поподания) при данной реализации кода (см. выше)?
                              Третий параметр gluUnProject - значение z - буфера (ну или глубина сцены). И она должна идти от 0 до 1. Вообще, ИМХО, для выбора лучше использовать gluProject - вычисляешь оконные координаты каждой вершины и смотришь расстояние до координат мыши.
                                Так, хорошо вот набросал такую функцию:

                                ExpandedWrap disabled
                                   void _Transform(POINT3D ptObject, POINT3D& ptScreen)
                                      {
                                          int    viewport[4];    // параметры viewport-a.
                                          GLdouble projection[16]; // матрица проекции.
                                          GLdouble modelview[16];  // видовая матрица.
                                          GLdouble vx, vy, vz;     // координаты курсора мыши в системе координат viewport-a.
                                          GLdouble wx, wy, wz;     // возвращаемые мировые координаты.
                                   
                                          glGetIntegerv(GL_VIEWPORT, viewport);            // узнаём параметры viewport-a.
                                          glGetDoublev(GL_PROJECTION_MATRIX, projection);  // узнаём матрицу проекции.
                                          glGetDoublev(GL_MODELVIEW_MATRIX, modelview);    // узнаём видовую матрицу.
                                   
                                          gluProject(ptObject.x, ptObject.y, ptObject.z, modelview, projection, viewport, &ptScreen.x, &ptScreen.y, &ptScreen.z);
                                      }


                                Есть объект (куб) который рисуется в центре сцены (основание = 0) с гранью = 10, если координаты вершины -5, -5, 10
                                то данный метод возвращает 839, 676 (размер окна 940х656), естественно вершина находится в другом месте, причем вроде как работает...
                                координаты вершин - это получается чередование значений -5(5), -5(5), 10(0) так и на выходе череда значений 839(100), 676(-63) но как применить
                                результат я пока не знаю. Так как когда мышь над вершинами (смотрим сбоку) то координаты 389,304 - 389,141(левая грань) и 551,304 - 551,141 (правая грань).

                                Это раз. +Если развернуть сцену, то координаты возвращаются такие же.
                                Короче говоря где можно посмотреть рабочий пример выбора вершин, или хотя бы подробные действия что и как делать, что бы мне разобраться раз и навсегда, да и возможно другим будет интересно.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 [2] 3 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0486 ]   [ 21 queries used ]   [ Generated: 8.06.23, 22:27 GMT ]