![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.5.240] |
![]() |
|
Страницы: (4) [1] 2 3 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Доброго времени суток!
Начал изучать OpenGL... Вопрос к приемеру есть сетка: ![]() ![]() 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 далее рисуется куб: ![]() ![]() 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 все это дело отрисовывается в методе: ![]() ![]() // .... 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) и т.д. |
![]() |
Сообщ.
#2
,
|
|
Не понял, в чем вопрос? Как сделать чтобы сетк вращалась отдельно? Если так, то сделай примерно так:
![]() ![]() 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(); |
Сообщ.
#3
,
|
|
|
To OpenGL, нет, наоборот так чтобы сетка и куб вращались вместе т.е. куб должен быть в координатах сетки (вершины куба), а сей час..., хотя сетка и куб рисуются с координатами центра 0,0,0 но при вращении куб ведет себя как бы отдельно...
На рисунке видно, что (1) вид сбоку - нормально, (2) вид сверху - нормально, но при вращении (3) - как будто он (куб) выше сетки (а он должен быть на половину выше (т.к. центры у них совпадают), на (4) - как будто он на краю сетки, хотя он должен быть в центре... Т.е. куб при вращении ползает по сетке, а должен быть в заданной позиции (в данном случае в центре).[attach=#0][/attach] |
![]() |
Сообщ.
#4
,
|
|
Картинку не увидел, но по описанию похоже что ты не включил depth test. Попробуй:
![]() ![]() //при инициализации glEnable(GL_DEPTH_TEST); //при рисовании glClear(GL_DEPTH_BUFFER_BIT); |
Сообщ.
#5
,
|
|
|
Во... даже .rar не прикрепляется (c .exe). Попробую объяснить на пальцах... короче говоря куб при вращении сцены как будто ползает по сетке, а должен быть как монолит, т.е. жестко привязан к координатам сетки...
Как это реализовать или где посмотреть исходник самого простого 3D редактора? Добавлено glEnable(GL_DEPTH_TEST) - есть такое дело... дело не в этом... такое впечатление, что куб должен маштабироваться отдельно... |
![]() |
Сообщ.
#6
,
|
|
M Может тогда весь код покажешь? Цитата Sergey Bogoyavlenskiy @ такое впечатление, что куб должен маштабироваться отдельно... При чем здесь масштабирование, мы же вроде о вращении говорили... Цитата Sergey Bogoyavlenskiy @ где посмотреть исходник самого простого 3D редактора? Дома был, вечером возможно выложу. |
Сообщ.
#7
,
|
|
|
Про Прикрепление файла... все равно не могу... не крепит и всё тут... ни .jpeg ни .rar файл выбирается, но как его крепить?
Если после выбора делать предпросмотр, то файла нет, если нажать на [attach] то в сообщении появляетя [attach=#0][/attach]... а файла нет. А так я бы и код выложил и .exe в .rar и картинки... на счет кода то он разбит по классам, но принцип такой при обработке перемещения мыши изменяются m_RenderParams.Position (три float x, y, z), а также аналогично m_RenderParams.Rotation (x, y, z) далее, до начала отрисовки: ![]() ![]() // .... 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, вроде они вращаются, маштабируются но как бы это сказать... каждый по свойму... нет ощущения единой сцены... |
![]() |
Сообщ.
#8
,
|
|
Все-таки что-то мне подсказывает что дело в depth test
![]() |
Сообщ.
#9
,
|
|
|
поменял, но все один к одному... возможно если двигать камеру то все было бы в порядке, но многие пишут, что разницы между (изменением положения камеры относительно сцены и изменением положения сцены относительно камеры) принципиальной нет. Вот просто представьте себе куб на плоскости (в центре) когда мы смотрим сверху то все нормально, но мы начинаем вращать пусть даже по одной оси, к примеру, от себя (пока сетка(плоскость) не станет одной линией) куб как бы должен сдвигаться назад к центру сетки(плоскости), а он рисуется, хотя и тоже вращается вместе с сеткой, в центре экрана, а не в центре сетки... Извините, но лучше объяснить у меня не получается.
|
![]() |
Сообщ.
#10
,
|
|
То есть, куб всегда у тебя рисуется выше/впереди сетки? |
![]() |
Сообщ.
#11
,
|
|
Цитата Sergey Bogoyavlenskiy @ Про Прикрепление файла... все равно не могу... не крепит и всё тут... ни .jpeg ни .rar файл выбирается, но как его крепить? Если после выбора делать предпросмотр, то файла нет, если нажать на [attach] то в сообщении появляетя [attach=#0][/attach]... а файла нет. Тег attach выполняет несколько другую функцию, он позволяет указать, в каком месте поста его выводить, а так же позволяет задать свое пояснение Что бы прикрепить файл, его достаточно просто выбрать, и нажать "Отправить" |
Сообщ.
#12
,
|
|
|
Пробую прикрепить файл...
Прикреплённый файл ![]() Добавлено Прикрепил! ![]() |
![]() |
Сообщ.
#13
,
|
|
Может лучше исходники выложишь? Здесь у меня MSVCR80.dll не установлена
![]() |
Сообщ.
#14
,
|
|
|
Вот что-то в этом роде, за качество кода извините, но суть думаю будет понятна...
Прикреплённый файл ![]() Добавлено Ну, с этим ладно, в принципе работает да и ладно, но возник еще один вопрос, изначально выводится сетка, затем куб, когда оно серое то особо не заметно, но когда установил различные цвета (для сетки и для куба) то происходит мерцание сетки на кубе при вращении как с этим бороться или это уже зависит от видеокарты? |
![]() |
Сообщ.
#15
,
|
|
Мерцание сетки вызвано тем, что она идет точь-в-точь по грани и в тех местах из-за погрешностей получается больше то одна величина, то другая. А с первой проблемой не понял - у меня все рисуется как надо.
|