Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL (OpenTK 2010), Добавить фигуру (вообще любую) 
V
    Опции темы
Garcian
  Дата 18.4.2012, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Здравствуйте. Изучаю OpenGL по довольно хорошему курсу лекций. Приведенный пример довольно простой - рисуется треугольник (Paint событие), он поворачивается вокруг любой оси и изменяется при изменении размера окна (Resize). Допустим, я хочу добавить фигуру в glControl, чтобы с ней можно было делать все тоже самое  smile с помощью какой либо кнопки  Вот этот пример:
Код

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        float AngleX = 0;
        float AngleY = 0;
        float AngleZ = 0;

        const float AngleDl = 5;

        public Form1()
        {
            InitializeComponent();
        }

        // изменение размера окна
        private void glControl1_Resize(object sender, EventArgs e)
        {
            SetupViewport();
            glControl1.Invalidate();
        }

        private void SetupViewport()
        {
            int w = glControl1.Width;
            int h = glControl1.Height;
            GL.MatrixMode(MatrixMode.Projection);
            GL.LoadIdentity();
            GL.Ortho(0, w, 0, h, -1, 1); 
            GL.Viewport(0, 0, w, h); 
        }
        private void glControl1_Paint(object sender, PaintEventArgs e)
        {

            GL.ClearColor(0.5f, 0.5f, 0.75f, 1.0f); // цвет фона
            // очистка буферов цвета и глубины
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            // поворот изображения
            GL.LoadIdentity();
            GL.Rotate(AngleX, 1.0, 0.0, 0.0);
            GL.Rotate(AngleY, 0.0, 1.0, 0.0);
            GL.Rotate(AngleZ, 0.0, 0.0, 1.0);

            // формирование изображения
            GL.Color3(1f, 0f, 0f); 
            GL.Begin(BeginMode.Triangles);
                // треугольник 1
                GL.Vertex3(-0.7, -0.7, 0);
                GL.Vertex3(-0.7, 0.7, 0);
                GL.Vertex3(-0.1, -0.7, 0);
            GL.End();

            // завершение формирования изображения

            GL.Flush();
            GL.Finish();

            glControl1.SwapBuffers();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetupViewport();
        }

        // повороты
        private void glControl1_KeyDown(object sender, KeyEventArgs e)
        {
            switch(e.KeyCode)
            {
                case Keys.Insert: 
                    AngleX += AngleDl;
                    break;
                case Keys.Delete: 
                    AngleX -= AngleDl;
                    break;
                case Keys.Home: 
                    AngleY += AngleDl;
                    break;
                case Keys.End: 
                    AngleY -= AngleDl;
                    break;
                case Keys.Prior: 
                    AngleZ += AngleDl;
                    break;
                case Keys.Next: 
                    AngleZ -= AngleDl;
                    break;
            }
            glControl1.Invalidate(); 
        }
    }
}


А это уже от меня.
Вот обработка кнопки по добавлению треугольника:
Код

        private void menuToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
            GL.LoadIdentity();
            GL.Color3(1f, 0f, 0f);
            GL.Begin(BeginMode.Triangles);
                GL.Vertex3(0.0, 0.2, 0);
                GL.Vertex3(0.5, -0.5, 0);
                GL.Vertex3(0.7, 0.3, 0);
            GL.End();
            glControl1.SwapBuffers();
        }


Ну и получается, яное дело, ерунда. События никак не связаны с новым треугольником. 
Подскажите, пожалуйста, как надо.

Это сообщение отредактировал(а) Garcian - 18.4.2012, 19:44
--------------------
Неродивый студент
PM MAIL   Вверх
Garcian
Дата 19.4.2012, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Нету никого, кто бы в OpenGL разбирался? Или я вопрос сформулировал плохо? По сути, он даже, наверное, самого GL и не касается, а дело в непонимании мной работы обработчика событий.
--------------------
Неродивый студент
PM MAIL   Вверх
Veitmen
Дата 20.4.2012, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 10.11.2006
Где: СПБ

Репутация: нет
Всего: 4



Привет.

Объясните чего вы сделать хотите. А то не понятно...
PM MAIL ICQ   Вверх
Garcian
Дата 20.4.2012, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Первый листинг - рисуется треугольник в 3х мерном пространстве (событие Paint). Его можно вертеть, окно можно растягивать - изображение преобразуется в реальном времени.
Я хочу сделать возможным добавление треугольника с помощью кнопки - листинг 2, чтобы он тоже преобразовывался в реальном времени. Но на деле у меня этого не происходит.

Это сообщение отредактировал(а) Garcian - 20.4.2012, 16:46
--------------------
Неродивый студент
PM MAIL   Вверх
SlimsUA
Дата 22.4.2012, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.4.2012
Где: Украина, Донецк

Репутация: нет
Всего: нет



Если вкратце, то в твоём коде "добавления треугольника"  никакого добавления не происходит. Там выполняется просто однократная отрисовка. Весь рендеринг должен происходить в glControl1_Paint(...). Для рисования произвольного количества объектов со связанной или независимой трансформацией необходимо иметь класс (или структуру - смотря какая сложность и разнообразие нужны), содержащий информацию о фигуре (меше, модели, и т.д.). Экземпляры этого класса придется хранить в динамическом массиве (или списке, дереве, или иной коллекции), а в glControl1_Paint(...) делать проход по элементам коллекции и выводить их на экран, применяя к каждому его собственную трансформацию. А вот в обработчике нажатия кнопки - создавать новый экземпляр класса фигуры, заполнять данными (вершины, цвет, сдвиги, повороты, масштабирования и т.д.) и добавлять объект в коллекцию.

P.S. Ну это если очень бегло и вкратце...

P.P.S. Ссылкой на курс лекций не поделишься?

Это сообщение отредактировал(а) SlimsUA - 22.4.2012, 00:44
PM MAIL ICQ   Вверх
Garcian
Дата 22.4.2012, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Спасибо, лично я этот вопрос пока оставил, так как времени осуществлять задумку просто нету.
Курс лекций с INTUIT.ru, для записи на курсы там надо зарегестрироваться (все бесплатно). Курс называется: Создание графическиx моделей с помощью Open Graphics Library
Автор: В.Н. Лихачев 
Ссылка на курс: http://www.intuit.ru/department/graphics/grogl/

зы: насчет класса, может я что то и не правильно делал, но объект GL, как я понял, создается при добавлении glControl на форму. Поэтому, когда я использовал класс, обрабатывающий объекты GL - компилятор ругался, говорил что нету ссылки на объект. При попытке создать new GL() - ничего не изменялось. Поэтому бОльшая часть обработки изображения (повороты, масштибирование, перекрытие, освещение, а также создание случайных треугольников) у меня происходит в самой Form1.cs. Отдельный класс у меня лишь нахождение нормалей к поверхностям.

Это сообщение отредактировал(а) Garcian - 22.4.2012, 07:53
--------------------
Неродивый студент
PM MAIL   Вверх
SlimsUA
Дата 22.4.2012, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.4.2012
Где: Украина, Донецк

Репутация: нет
Всего: нет



Ты не только неправильно делал, ты неправильно понял. Класс OpenTK.Graphics.OpenGL.GL не хранит информацию об объекте, который нужно отрисовать, поэтому создавать его экземпляры бессмысленно и бесполезно.
Вот посмотри его документацию: OpenTK.Graphics.OpenGL.GL smile . 99% его методов - это статики, биндинги к Си-интерфейсу OpenGL, оставшийся 1% относится к иерархии наследования, т.е. существование экземпляра объекта GL вообще не обязательно. Класс GL занимается передачей твоих данных конвейеру рендеринга OpenGL. Вопрос в том, откуда ему брать эти данные.

Посмотрим часть кода из твоей формы:
Код

// Кусок номер раз
public partial class Form1 : Form
    {
        float AngleX = 0;
        float AngleY = 0;
        float AngleZ = 0;

        ...

//Кусок номер два
private void glControl1_Paint(object sender, PaintEventArgs e)
    {
        GL.ClearColor(0.5f, 0.5f, 0.75f, 1.0f); // цвет фона
        // очистка буферов цвета и глубины
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        // поворот изображения
        GL.LoadIdentity();
        GL.Rotate(AngleX, 1.0, 0.0, 0.0);
        GL.Rotate(AngleY, 0.0, 1.0, 0.0);
        GL.Rotate(AngleZ, 0.0, 0.0, 1.0);
        // формирование изображения
        GL.Color3(1f, 0f, 0f); 
        GL.Begin(BeginMode.Triangles);
            // треугольник 1
            GL.Vertex3(-0.7, -0.7, 0);
            GL.Vertex3(-0.7, 0.7, 0);
            GL.Vertex3(-0.1, -0.7, 0);
        GL.End();
        // завершение формирования изображения
        GL.Flush();
        GL.Finish();
        glControl1.SwapBuffers();
    }


Получается, что все данные о треугольнике у тебя прописаны непосредственно в коде ( GL.Color3(1f, 0f, 0f);  GL.Vertex3(-0.7, -0.7, 0); и т.д. ) и в переменных формы ( AngleX, AngleY, ...). Вот их то и нужны помещать в отдельную структуру данных, что-то вроде:
Код

public class Triangle
{
    Vector3[3] vertices;
    float[3] vertex_colors;
    Vector3 rotation_angles;    
}

Для каждого треугольника создавать свой экземпляр Triangle, а для динамически создаваемых треугольников хранить их в какой-либо коллекции, позволяющей динамическое изменение количества элементов. В методе отрисовки (glControl1_Paint в твоем случае) перебирать элементы коллекции в цикле и выводить их на экран.

P.S. И вот еще... Для написания игр GLControl не подходит. В нем реализован цикл, основанный на событиях, т.е. пока не будет вызван GLControl.Invalidate() перерисовки не произойдет. Грубо говоря, пока не нажмешь кнопку - ничего нового не нарисуется. Представляешь? В гонках нажал газ - ты едешь, соперники едут, деревья качаются, дождь идет, кнопку отпустил - всё замерло  smile 
Так что для игр нужно использовать OpenTK.GameWindow.

P.P.S. И еще одно, изучай теорию. Вот тут: ссылочка рекомендую посмотреть первые пять роликов. Видео-курс вообще  посвящен XNA Game Studio, но в этих роликах достаточно наглядно показываются теоретические основы.

PM MAIL ICQ   Вверх
Garcian
Дата 22.4.2012, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 5.11.2008

Репутация: нет
Всего: нет



Спасибо, обязательно посмотрю) Пока надобности делать игры нет, надо КГ сдать  smile 
--------------------
Неродивый студент
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1200 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.