
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.231.217.107] |
![]() |
|
Страницы: (4) 1 [2] 3 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Проблема была не с OpenGL а с видеокартой, (на работе встроеная) дома - все OK. Но про мерцание сетки не понял... У меня это выглядит так, как будто куб - частично прозрачный т.е. в зависимости от поворота через него видно сетку или ее часть.
|
![]() |
Сообщ.
#17
,
|
|
Видна именно та часть сетки, которая должна быть внутри куба, или лежащая на его гранях? Если второе, то так и должно быть.
|
Сообщ.
#18
,
|
|
|
Вот картинка...
Прикреплённая картинка
![]() Добавлено Исходники те же, только разные цвета для сетки и куба. Добавлено Причем, это не только с кубом, даже если поверх сетки выводить плоскость ![]() ![]() 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(); } плоскость лежит сверху на приличной высоте над сеткой, но при вращении эффект тот же, части сетки (линии) мерцают при вращении т.е. отрисовываются поверх плоскости. |
![]() |
Сообщ.
#19
,
|
|
Скриншот выглядит довольно загадочно
![]() Сейчас на работе, смогу запустить код только дома. |
Сообщ.
#20
,
|
|
|
Пробавл на 3-х, правда, на всех Windows 7. Но скорее всего причина в другом...
|
Сообщ.
#21
,
|
|
|
Вот еще рисунок на 1-м красная плоскость намного выше зеленной, но ее часть закрашивается зеленым (мерцает при повороте).
На втором красная плоскость (квадрат) находится за зеленной! Но она также мерцает т.е. прокрашивается... при поворотах. Прикреплённая картинка
![]() Добавлено что то с depth test т.к. если вызвать glDisable(GL_DEPTH_TEST); между отрисовками плоскостей то мерцание исчезает, правда рисуется нормально только на первый взглад... до поворота на 180... |
![]() |
Сообщ.
#22
,
|
|
У тебя во многих местах вызывается hDC=GetDC(...); Скорей всего, проблема в этом - у меня сначала вылезали непонятные баги, но после удаления этих строк все стало нормально. На всякий случай прикладываю архив того, что у меня получилось.
Архив, только исходники ![]() |
Сообщ.
#23
,
|
|
|
Спасибо, но возник еще вопрос, задумал я отрисовать в левом нижнем углу вектора направления осей (X, Y, Z) вот (в одном из примеров "нарыл"):
![]() ![]() 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 окна. |
![]() |
Сообщ.
#24
,
|
|
У меня не рисуются оси твоей функцией
![]() ![]() ![]() 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); } |
Сообщ.
#25
,
|
|
|
Вот спасибо! Ну и еще, последний вопрос, дальше буду сам разбираться...
Видел много реализаций 3d объектов (реализаций на C++), но все расчитаны под 3ds max и т.д. А мне бы для начало что-нибудь попроще (что бы вникнуть), как правильно хранить вершины, ребра, плоскости. Так что бы в дальнейшем можно было осуществять их выбор и редактирование, пусть хотя бы только редактирование вершин... Где такое можно подсмотреть? |
![]() |
Сообщ.
#26
,
|
|
Цитата Sergey Bogoyavlenskiy @ Видел много реализаций 3d объектов (реализаций на C++), но все расчитаны под 3ds max При чем здесь 3d max? Библиотеки содержат инструменты, необходимые для загрузки, отображения и пр. дествий с 3D объектами. Самое простое (и довольно универсальное решение) сделать так: объект - массив граней + информация о его повороте и положении, грань - массив вершин, вершина - координаты, цвет и нормаль. |
Сообщ.
#27
,
|
|
|
Вот, вот!!! Нет, 3ds max здесь действительно не к месту, согласен, это я так для примера, а вот за массив граней и т.д. спасибо! Буду копать в этом направлении.
|
Сообщ.
#28
,
|
|
|
Вот и еще вопрос... ковырялся, googlil, но... Кроче говоря объектную модель сделал, все рисуется, все замечательно вершины упоковал в вектор и т.д. т.е. могу ходить по вершинам, по граням, по объектам, но теперь возник вопрос о выборе вершины мышью... нашел такой код:
![]() ![]() 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). Так вот собственно и вопрос как правильно выбирать (тест поподания) при данной реализации кода (см. выше)? |
![]() |
Сообщ.
#29
,
|
|
Третий параметр gluUnProject - значение z - буфера (ну или глубина сцены). И она должна идти от 0 до 1. Вообще, ИМХО, для выбора лучше использовать gluProject - вычисляешь оконные координаты каждой вершины и смотришь расстояние до координат мыши.
|
Сообщ.
#30
,
|
|
|
Так, хорошо вот набросал такую функцию:
![]() ![]() 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 (правая грань). Это раз. +Если развернуть сцену, то координаты возвращаются такие же. Короче говоря где можно посмотреть рабочий пример выбора вершин, или хотя бы подробные действия что и как делать, что бы мне разобраться раз и навсегда, да и возможно другим будет интересно. |