Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2013, 10:45   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос OpenGL - почему имеет странное направление координат

Разбираюсь с различными графическими библиотеками и с решением задач на их основе. Взял с официального сайта OpenTK класс для загрузки текстур (приложен к посту). Немного подправил методы класса, взятого от туда же:
Код:
    protected override void OnLoad(EventArgs e)
    {
      //
      // Initialize alpha-blended texturing
      //
      TexUtil.InitTexturing();
      //
      // Creating a texture
      //
      /*textureId = TexUtil.CreateRGBTexture(2, 2,  
        new byte[] { 
          255,0,0, // Red
          0,255,0, // Green
          0,0,255, // Blue
          255,255,255 // White
        });*/

			textureId=TexUtil.CreateTextureFromFile("1.jpg");


      OnResize(null);
      GL.ClearColor(Color.Blue);
    }
    
protected override void OnRenderFrame(FrameEventArgs e)
    {
      GL.Clear(ClearBufferMask.ColorBufferBit);
      GL.MatrixMode(MatrixMode.Modelview);
      GL.LoadIdentity();
      GL.BindTexture(TextureTarget.Texture2D, textureId);
      GL.Begin(BeginMode.Quads);
        GL.TexCoord2(0, 0);      GL.Vertex2(10, 10);
        GL.TexCoord2(1, 0);      GL.Vertex2(1000, 10);
        GL.TexCoord2(1, 1);      GL.Vertex2(1000, 1000);
        GL.TexCoord2(0, 1);      GL.Vertex2(10, 1000);
      GL.End();
      SwapBuffers();
    }
Запускаю, текстура из файла "1.jpg" накладывается, но почему-то кверх ногами. Начал читать сперва ТУТ и затем на нашем форуме это(линк):
Цитата:
Сообщение от RomiKon Посмотреть сообщение
Текстура перевёрнутая потому что в Windows принято что ось Y направлена вниз, а в OpenGL вверх. Проблема решается тремя способами:
1) направить ось Y в OpenGL вниз(самый плохой способ)
2) инвертировать второй параметр функции gltexcoord2f(x, 1-y);
3) перевернуть растр текстуры в любом графическом редакторе( я так всегда и делаю)
и понимаю, что всего лишь нужно немного исправить координаты:
Код:
protected override void OnRenderFrame(FrameEventArgs e)
    {
      GL.Clear(ClearBufferMask.ColorBufferBit);
      GL.MatrixMode(MatrixMode.Modelview);
      GL.LoadIdentity();
      GL.BindTexture(TextureTarget.Texture2D, textureId);
      GL.Begin(BeginMode.Quads);
        GL.TexCoord2(0, 0);      GL.Vertex2(10, 10);
        GL.TexCoord2(1, 0);      GL.Vertex2(1000, 10);
        GL.TexCoord2(1, -1);//здесь
      GL.Vertex2(1000, 1000);
        GL.TexCoord2(0, -1);//и здесь берем -1, вместо 1
      GL.Vertex2(10, 1000);
      GL.End();
      SwapBuffers();
    }
и все действительно нормально заработало.
Подскажите пожалуйста, почему система координат и их направление в OpenGL немного странная, точнее не соответствует общепринятой? На какие грабли могу наступить, используя указанную методику переворота текстуры (примененный метод автор вышеуказанного поста назвал "самым плохим")?
Вложения
Тип файла: zip TexLib.zip (3.0 Кб, 6 просмотров)
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 06.01.2013 в 10:47.
Mixim вне форума Ответить с цитированием
Старый 06.01.2013, 12:02   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
почему система координат и их направление в OpenGL немного странная,
Она не странная, это Вам так кажется. OGL использует Декартову систему координат, а Windows экранную.
У Декартовой системы, отсчёт координат идёт из левого нижнего угла, вправо ось X, вверх - Y, по диагонали - Z. У экранной, из левого верхнего угла. Так было принято на заре компьютерной техники, когда выводились только тексты и выводить их в таких координатах было проще.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 06.01.2013 в 13:17.
Smitt&Wesson вне форума Ответить с цитированием
Старый 06.01.2013, 14:21   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Она не странная, это Вам так кажется. OGL использует Декартову систему координат, а Windows экранную.
У Декартовой системы, отсчёт координат идёт из левого нижнего угла, вправо ось X, вверх - Y, по диагонали - Z. У экранной, из левого верхнего угла. Так было принято на заре компьютерной техники, когда выводились только тексты и выводить их в таких координатах было проще.
В какой-то мере согласен, но сейчас, согласитесь, это вызывает дополнительные проблемы. Позвольте тогда поинтересоваться: а каким образом можно моментально перевернуть изображение для текстуры на 180 градусов? Пока нашел только здесь ссылку на старую либу с функцией Rotate90CW, которая это и выполняет.
Уже около 6 месяцев использую вместо Windows ОС Ubuntu. Пока что всем доволен и даже малейшего желания нет возвращаться на Windows
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 06.01.2013, 14:54   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
В какой-то мере согласен, но сейчас, согласитесь, это вызывает дополнительные проблемы.
согласитесь, переделывать море уже созданного ПО только потому, что у вас сейчас это вызывает дополнительные проблемы, согласитесь, никто не будет.

Цитата:
Уже около 6 месяцев использую вместо Windows ОС Ubuntu. Пока что всем доволен и даже малейшего желания нет возвращаться на Windows
очень рады за вас.

Цитата:
можно моментально перевернуть изображение для текстуры на 180 градусов?
моментально, это только заранее подготовить, как и делает автор рекомендации, а потом лишь подгружать. Вот ежели в процессе работы, то второй способ с инверсией - самое оно.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 06.01.2013, 15:02   #5
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
согласитесь, переделывать море уже созданного ПО только потому, что у вас сейчас это вызывает дополнительные проблемы, согласитесь, никто не будет.

очень рады за вас.

моментально, это только заранее подготовить, как и делает автор рекомендации, а потом лишь подгружать. Вот ежели в процессе работы, то второй способ с инверсией - самое оно.
В итоге поковырявшись, решил во время подгрузки текстуры (обработки bmp файла с ней) использовать метод RotateFlip, благо он есть и в Gtk#. В 3D еще не смотрел как это будет выглядеть, но в 2D все вполне прилично смотрится
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить направление движения Monny Общие вопросы C/C++ 2 29.11.2012 15:51
Система координат в OpenGL WarHamster Помощь студентам 0 17.03.2011 15:53
Поиск координат мыши на рельефе OpenGL AngelOfDeathSX Мультимедиа в Delphi 1 12.03.2011 12:40
Система координат в OpenGl. Вадим Буренков Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 02.06.2009 09:12