Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: [РЕШЕНО] C++ и openGL. масштабирование.  (Прочитано 8053 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн losvik

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
[РЕШЕНО] C++ и openGL. масштабирование.
« : 19 Октября 2010, 19:30:54 »
В общем пишу в Visual C++ 6.0 лабораторную по Комп геометрии и графике.
 Задача: Масштабирование прямоугольника и треугольника в противофазе. При нажатии ЛКМ фигуры масштабируются. При ПКМ - в дефолтное состояние.
 На данный момент fig0 уменьшается, а fig1 увеличивается.  Но масштабирование начинается не от исходных размеров фигур, а от начала координат.
Во так это выглядит( фигуры большего размера - дефолтные fig0(); и fig1(); ) :

(Нажмите, чтобы показать/скрыть)


 Как достичь именно масштабирования фигур, чтобы изменялись начальные размеры заданных фигур. И еще, как видно из скрина - увеличение  значения координаты x ведет к движению треугольника вправо( с прямоугольником таже ситуация), что логично, но требуется достичь эффекта зума.  Например у треугольника -  точка 6,0 оставалась недвижимой, а остальные увеличивались.

Гугл выдал похожую тему http://www.cyberforum.ru/graphics/thread109534.html , но тот метод, что там описан ( пересчитывание координат) был мною непонят). Прошу обьяснить как именно реализовать нужное масштабирование.

Листинг:
(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль 19 Октября 2010, 22:30:42:
я так понял что у меня что то не так в функции mouse(), так как без нее фигуры масштабируются почти как надо( со смещением по оси х).
« Последнее редактирование: 28 Октября 2010, 21:42:26 от dhuss »

Оффлайн __v1tos

  • Участник
  • *
  • Сообщений: 105
  • Ubuntuu 10.10 x86-64
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #1 : 20 Октября 2010, 21:13:09 »
Почитайте про матрицы, про проекционную и видовую (glMatrixMode(GL_PROJECTION); glMatrixMode(GL_MODELVIEW);)
glLoadIdentity(); "сбрасывает" текущую матрицу на центр координат, поэтому после все и происходит из центра.
AMD Phenom II 945, GA-MA790GPT-UD3H (HD 3300), 5 GiB ram

Оффлайн losvik

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #2 : 20 Октября 2010, 21:25:08 »
Про матрицы прочту. Про glLoadIdentity() знал, но не заметил. Спасибо, за напраление!)
---
upd: прочел про режимы и вроде они выставлены правильно. glLoadIdentity() думаю не влияет так как я испольую glPushMatrix() и  glPopMatrix() которые записывают и восстанавливают текущие матрицы из стека.  Но я все равно убрал glLoadIdentity() из init(), но это ни на что не повлияло.
Читаю документацию по функциям OpenGL, но конкретных примеров использования там нету. Мб кто то этим занимается более менее  серьезно? Что  я делаю не так?
« Последнее редактирование: 20 Октября 2010, 23:00:01 от dhuss »

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #3 : 21 Октября 2010, 00:12:05 »
Все правильно... так это и будет масштабироваться..... т.к. "центр модели" в (0;0;0).... если "перенести центр" треугольника таким образом, чтобы центр был в его середине, а не "за бортом" все будет нормально  .... для этого используются матрицы преобразования модели (характерный пример ... того как это работает ... при разном порядке вызова  переноса и вращения, например, добиваются эффекта, когда "луна крутится вокруг своей оси и еще вокруг "земли" (т.е. сначала вокруг своей оси, затем вокруг земли или наоборот.... - смещается центр вращения(масштабирования)) и т.д.) Если будет понимание как создать программу (земля-луна), то догадаешься и про масштабирование....
« Последнее редактирование: 21 Октября 2010, 00:13:54 от maximum2000 »

Оффлайн losvik

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #4 : 21 Октября 2010, 00:25:48 »
Все правильно... так это и будет масштабироваться..... т.к. "центр модели" в (0;0;0).... если "перенести центр" треугольника таким образом, чтобы центр был в его середине, а не "за бортом" все будет нормально  .... для этого используются матрицы преобразования модели (характерный пример ... того как это работает ... при разном порядке вызова  переноса и вращения, например, добиваются эффекта, когда "луна крутится вокруг своей оси и еще вокруг "земли" (т.е. сначала вокруг своей оси, затем вокруг земли или наоборот.... - смещается центр вращения(масштабирования)) и т.д.) Если будет понимание как создать программу (земля-луна), то догадаешься и про масштабирование....
спс, буду перечитывать и думать)

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #5 : 21 Октября 2010, 01:16:22 »
Все правильно... так это и будет масштабироваться..... т.к. "центр модели" в (0;0;0).... если "перенести центр" треугольника таким образом, чтобы центр был в его середине, а не "за бортом" все будет нормально  .... для этого используются матрицы преобразования модели (характерный пример ... того как это работает ... при разном порядке вызова  переноса и вращения, например, добиваются эффекта, когда "луна крутится вокруг своей оси и еще вокруг "земли" (т.е. сначала вокруг своей оси, затем вокруг земли или наоборот.... - смещается центр вращения(масштабирования)) и т.д.) Если будет понимание как создать программу (земля-луна), то догадаешься и про масштабирование....
спс, буду перечитывать и думать)

ok :)

Оффлайн losvik

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #6 : 21 Октября 2010, 02:02:06 »
то есть, как я понял, необходимо -
1)Translate(в центр так чтобы центр фигуры был в 0,0)
2)glScalef()
3)Translate(в исходное расположение)
Так? о0

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #7 : 21 Октября 2010, 12:01:38 »
Проще нарисовать в центре, потом добавить масштабирование и передвинуть на нужную позицию. Количество трансформаций лучше минимизировать.

Оффлайн losvik

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #8 : 21 Октября 2010, 16:44:12 »
Спасибо всем, разобрался таки :)

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #9 : 21 Октября 2010, 16:55:04 »
Спасибо всем, разобрался таки :)

молодец :)

Оффлайн losvik

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #10 : 26 Октября 2010, 21:00:09 »
Спасибо всем, разобрался таки :)

молодец :)
чо то не молодец)
в общем с масштабированием действительно разобрался, но теперь возникла проблема с организованием цикла, для масштабирования в противофазе.
Задача - После ЛКМ начинается масштабирование(треуг. уменьшается, прямоуг. увеличивается, потом наоборот) После ПКМ процесс останавливается.
Код:

(Нажмите, чтобы показать/скрыть)


Скрин:
(Нажмите, чтобы показать/скрыть)
То есть код масштабирует один цикл - треуг. увеличивается, прямоуг. уменьшается, Не могу заставить их продолжить масштабироваться.
Безуспешно пытался подбирать условие, циклы даже пытался организовывать, но с циклами итерация не останавливается сразу же после ПКМ.
Вот решил еще раз потревожить, не могу справиться сам)
« Последнее редактирование: 26 Октября 2010, 21:10:11 от dhuss »

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #11 : 26 Октября 2010, 21:51:17 »
НУ вообще не рекомендуется множество раз выполнять масштабирование/перенос/вращение. Нужно все сбросить в 0 и применить преобразования 1 раз! не нужно 100 раз сдвигать объект на 1, если можно сразу перенести его на 100!


Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #12 : 26 Октября 2010, 22:00:05 »
А если попробовать через glutTimerFunc это сделать вместо glutIdleFunc?
http://www.opengl.org/resources/libraries/glut/spec3/node64.html
У меня где-то был рабочий пример непрерывной анимации (вращение сцены) именно через glutTimerFunc всё без проблем работало.

Ещё вопрос: кто такой Sleep? Я знаю sleep из unistd.h (параметр в секундах и практическая ценность этой функции стремиться к 0). Так же я знаю о Sleep из windows.h который принимает милисекунды, но на Linuxе как следует из названия хедера этой функции нету. Аналог виндового Sleep(delay) будет выглядеть так usleep(1000*delay) (#include <unistd.h>)

НУ вообще не рекомендуется множество раз выполнять масштабирование/перенос/вращение. Нужно все сбросить в 0 и применить преобразования 1 раз! не нужно 100 раз сдвигать объект на 1, если можно сразу перенести его на 100!
Так он же так и делает. Там многоктратная перерисовка сцены только для анимации. Или я чего-то не замечаю?

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #13 : 26 Октября 2010, 22:09:51 »
Возможно, ... очень может быть с GLUT'ом что-нибудь напутали. Я его (GLUT) не использовал и мало чем смогу помочь.... А вот по самому OpenGL очень даже, обращайтесь :)
« Последнее редактирование: 26 Октября 2010, 22:12:36 от maximum2000 »

Оффлайн losvik

  • Автор темы
  • Любитель
  • *
  • Сообщений: 62
    • Просмотр профиля
Re: C++ и openGL. масштабирование.
« Ответ #14 : 26 Октября 2010, 22:13:14 »
А если попробовать через glutTimerFunc это сделать вместо glutIdleFunc?
http://www.opengl.org/resources/libraries/glut/spec3/node64.html
У меня где-то был рабочий пример непрерывной анимации (вращение сцены) именно через glutTimerFunc всё без проблем работало.

Ещё вопрос: кто такой Sleep? Я знаю sleep из unistd.h (параметр в секундах и практическая ценность этой функции стремиться к 0). Так же я знаю о Sleep из windows.h который принимает милисекунды, но на Linuxе как следует из названия хедера этой функции нету. Аналог виндового Sleep(delay) будет выглядеть так usleep(1000*delay) (#include <unistd.h>)

НУ вообще не рекомендуется множество раз выполнять масштабирование/перенос/вращение. Нужно все сбросить в 0 и применить преобразования 1 раз! не нужно 100 раз сдвигать объект на 1, если можно сразу перенести его на 100!
Так он же так и делает. Там многоктратная перерисовка сцены только для анимации. Или я чего-то не замечаю?
пишу именно в Windows, т.е это и есть  - Sleep из windows.h который принимает милисекунды.

 

Страница сгенерирована за 0.022 секунд. Запросов: 20.