| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка Windows Forms > OpenGL (OpenTK 2010) |
| Автор: Garcian 18.4.2012, 19:43 | ||||
Здравствуйте. Изучаю OpenGL по довольно хорошему курсу лекций. Приведенный пример довольно простой - рисуется треугольник (Paint событие), он поворачивается вокруг любой оси и изменяется при изменении размера окна (Resize). Допустим, я хочу добавить фигуру в glControl, чтобы с ней можно было делать все тоже самое
А это уже от меня. Вот обработка кнопки по добавлению треугольника:
Ну и получается, яное дело, ерунда. События никак не связаны с новым треугольником. Подскажите, пожалуйста, как надо. |
| Автор: Garcian 19.4.2012, 19:16 |
| Нету никого, кто бы в OpenGL разбирался? Или я вопрос сформулировал плохо? По сути, он даже, наверное, самого GL и не касается, а дело в непонимании мной работы обработчика событий. |
| Автор: Veitmen 20.4.2012, 15:24 |
| Привет. Объясните чего вы сделать хотите. А то не понятно... |
| Автор: Garcian 20.4.2012, 16:43 |
| Первый листинг - рисуется треугольник в 3х мерном пространстве (событие Paint). Его можно вертеть, окно можно растягивать - изображение преобразуется в реальном времени. Я хочу сделать возможным добавление треугольника с помощью кнопки - листинг 2, чтобы он тоже преобразовывался в реальном времени. Но на деле у меня этого не происходит. |
| Автор: SlimsUA 22.4.2012, 00:42 |
| Если вкратце, то в твоём коде "добавления треугольника" никакого добавления не происходит. Там выполняется просто однократная отрисовка. Весь рендеринг должен происходить в glControl1_Paint(...). Для рисования произвольного количества объектов со связанной или независимой трансформацией необходимо иметь класс (или структуру - смотря какая сложность и разнообразие нужны), содержащий информацию о фигуре (меше, модели, и т.д.). Экземпляры этого класса придется хранить в динамическом массиве (или списке, дереве, или иной коллекции), а в glControl1_Paint(...) делать проход по элементам коллекции и выводить их на экран, применяя к каждому его собственную трансформацию. А вот в обработчике нажатия кнопки - создавать новый экземпляр класса фигуры, заполнять данными (вершины, цвет, сдвиги, повороты, масштабирования и т.д.) и добавлять объект в коллекцию. P.S. Ну это если очень бегло и вкратце... P.P.S. Ссылкой на курс лекций не поделишься? |
| Автор: Garcian 22.4.2012, 07:45 |
| Спасибо, лично я этот вопрос пока оставил, так как времени осуществлять задумку просто нету. Курс лекций с INTUIT.ru, для записи на курсы там надо зарегестрироваться (все бесплатно). Курс называется: Создание графическиx моделей с помощью Open Graphics Library Автор: В.Н. Лихачев Ссылка на курс: http://www.intuit.ru/department/graphics/grogl/ зы: насчет класса, может я что то и не правильно делал, но объект GL, как я понял, создается при добавлении glControl на форму. Поэтому, когда я использовал класс, обрабатывающий объекты GL - компилятор ругался, говорил что нету ссылки на объект. При попытке создать new GL() - ничего не изменялось. Поэтому бОльшая часть обработки изображения (повороты, масштибирование, перекрытие, освещение, а также создание случайных треугольников) у меня происходит в самой Form1.cs. Отдельный класс у меня лишь нахождение нормалей к поверхностям. |
| Автор: SlimsUA 22.4.2012, 13:51 | ||||
| Ты не только неправильно делал, ты неправильно понял. Класс OpenTK.Graphics.OpenGL.GL не хранит информацию об объекте, который нужно отрисовать, поэтому создавать его экземпляры бессмысленно и бесполезно. Вот посмотри его документацию: http://www.opentk.com/files/doc/class_open_t_k_1_1_graphics_1_1_open_g_l_1_1_g_l.html Посмотрим часть кода из твоей формы:
Получается, что все данные о треугольнике у тебя прописаны непосредственно в коде ( GL.Color3(1f, 0f, 0f); GL.Vertex3(-0.7, -0.7, 0); и т.д. ) и в переменных формы ( AngleX, AngleY, ...). Вот их то и нужны помещать в отдельную структуру данных, что-то вроде:
Для каждого треугольника создавать свой экземпляр Triangle, а для динамически создаваемых треугольников хранить их в какой-либо коллекции, позволяющей динамическое изменение количества элементов. В методе отрисовки (glControl1_Paint в твоем случае) перебирать элементы коллекции в цикле и выводить их на экран. P.S. И вот еще... Для написания игр GLControl не подходит. В нем реализован цикл, основанный на событиях, т.е. пока не будет вызван GLControl.Invalidate() перерисовки не произойдет. Грубо говоря, пока не нажмешь кнопку - ничего нового не нарисуется. Представляешь? В гонках нажал газ - ты едешь, соперники едут, деревья качаются, дождь идет, кнопку отпустил - всё замерло Так что для игр нужно использовать OpenTK.GameWindow. P.P.S. И еще одно, изучай теорию. Вот тут: http://www.it-portfolio.net/Post.aspx?id=71 рекомендую посмотреть первые пять роликов. Видео-курс вообще посвящен XNA Game Studio, но в этих роликах достаточно наглядно показываются теоретические основы. |
| Автор: Garcian 22.4.2012, 15:11 |
| Спасибо, обязательно посмотрю) Пока надобности делать игры нет, надо КГ сдать |