OpenGL Newbie - лучший способ перемещения объектов в сцене - PullRequest
4 голосов
/ 27 июня 2010

Я новичок в OpenGL и графическом программировании в целом, хотя мне всегда была интересна эта тема, поэтому я должен иметь теоретические знания.

Что я хотел бы сделать, так это создать сценув котором набор объектов движется.В частности, они роботы футболисты на поле.Объекты:

  • Освещение, поле и цели, которые не меняются
  • Шар, представляющий собой единую сетку, которая будет перемещаться и вращаться, но не масштабироваться
  • Игроки, каждый из которых состоит из частей тела, каждая из которых переведена и повернута, чтобы создать иллюзию связанного тела.

Так что, для моего начинающего ума GL, я бы хотелзагрузить эти объекты в сцену, а затем просто переместить их.Никакие свойства вершин не изменятся, ни их расположение, ни текстура / нормали / и т.д.Просто преобразование их «родительского» объекта в целом.

Кроме того, у всех игроков одинаковые тела.Могу ли я как-то оптимизировать, загрузив модель в память один раз, а затем нарисовав ее несколько раз с использованием другой матрицы преобразования?

В настоящее время я играю с OpenTK, который представляет собой облегченную оболочку поверх библиотек OpenGL.

Итак, полезным ответом на этот вопрос будет:

  • Какие части OpenGL дают мне то, что мне нужно?Нужно ли перерисовывать все лица в каждом кадре?Только те, которые двигаются?Могу ли я просто обновить некоторые матрицы преобразования?Насколько просто я могу сделать это, используя OpenTK?Как будет выглядеть psuedocode?Или
  • Есть ли лучшая платформа, которая бесплатна (в идеале с открытым исходным кодом) и обеспечивает этот уровень абстракции?

Обратите внимание, что мне требуется любое решение для запуска в .NETна нескольких платформах .

Ответы [ 3 ]

5 голосов
/ 27 июня 2010

Использование так называемых массивов вершин, вероятно, является самым верным способом оптимизации такой сцены.Вот хороший учебник:

http://www.songho.ca/opengl/gl_vertexarray.html

Массив вершин или, в более общем смысле, массив данных gl содержит такие данные, как положения вершин, нормали, цвета.У вас также может быть массив, содержащий индексы для этих буферов, чтобы указать, в каком порядке их рисовать.
Затем у вас есть несколько тесно связанных функций, которые управляют этими массивами, распределяют их, задают им данные и рисуют их.Вы можете выполнить рендеринг сложной сетки с помощью одной команды OpenGL, например glDrawElements()

. Эти массивы обычно находятся в памяти хоста. Дальнейшая оптимизация заключается в использовании объектов буфера вершин, которые имеют ту же концепцию, что и обычнаямассивы, но находятся в памяти графического процессора и могут быть несколько быстрее.Вот немного об этом:

http://www.songho.ca/opengl/gl_vbo.html

Работа с буферами по сравнению со старым добрым glBegin() .. glEnd() имеет преимущество совместимости с OpenGL ES.в OpenGL ES массивы и буферы - единственный способ рисовать вещи.

--- РЕДАКТИРОВАТЬ

Перемещение, вращение и преобразование объектов в сцене сделаноиспользование матрицы просмотра модели и не требует каких-либо изменений в данных сетки.Для иллюстрации:

у вас есть инициализация:

void initGL() {
  // create set of arrays to draw a player
  // set data in them
  // create set of arrays for ball
  // set data in them
}

void drawScene {
  glMatrixMode(GL_MODEL_VIEW);
  glLoadIdentity();
  // set up view transformation
  gluLookAt(...);
  drawPlayingField();

  glPushMatrix();
  glTranslate( player 1 position );
  drawPlayer();
  glPopMatrix();

  glPushMatrix();
  glTranslate( player 2 position );
  drawPlayer();
  glPopMatrix();

  glPushMatix();
  glTranslate( ball position );
  glRotate( ball rotation );
  drawBall();
  glPopMatrix();
}
4 голосов
/ 27 июня 2010

Поскольку вы только начинаете, я предлагаю перейти к немедленному режиму рендеринга и сначала заставить его работать.Если вам станет удобнее, вы можете улучшить работу с массивами вершин.Если вам станет еще удобнее, VBOs.И, наконец, если вы получаете супер удобство, создание экземпляров, которое является наиболее быстрым решением для вашего случая (без деформаций, только преобразования целых объектов).

Если вы не пытаетесь реализовать что-то вроде Fifa 2009, лучше всегопридерживайтесь простых методов, пока у вас не возникнет очевидная проблема эффективности.Нет необходимости преждевременно причинять себе головную боль.

Для преобразований всего объекта вы обычно преобразуете матрицу вида модели.

glPushMatrix();
// do gl transforms here and render your object
glPopMatrix();

Для загрузки объектов вам даже потребуется придумать некоторыеотформатировать или реализовать что-то, что может загружать форматы сетки (obj - один из самых простых поддерживаемых форматов).Существуют высокоуровневые библиотеки, чтобы упростить это, но я рекомендую использовать OpenGL для того, чтобы у вас был опыт и контроль.

1 голос
/ 27 июня 2010

Я надеялся, что с API OpenGL будет легко ориентироваться через поддержку IDE (intellisense и тому подобное).Через несколько часов стало очевидно, что необходимо установить некоторые основные правила.Поэтому я перестал печатать и RTFM.

http://www.glprogramming.com/red/

Лучший совет, который я мог бы дать любому, кто найдет этот вопрос, когда найдет основу для OpenGL.Долгое чтение, но расширение возможностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...