как получить новые координаты вершины прямоугольного блока после применения glRotate () - PullRequest
2 голосов
/ 27 февраля 2010

Я рисую прямоугольный блок:

GLfloat cubeVertexV[] = {
    // FRONT
    -0.5f, -1.0f,  0.5f,
     0.5f, -1.0f,  0.5f,
    -0.5f,  1.0f,  0.5f,
     0.5f,  1.0f,  0.5f,
    // BACK
    -0.5f, -1.0f,  -0.5f,
     0.5f, -1.0f,  -0.5f,
    -0.5f,  1.0f,  -0.5f,
     0.5f,  1.0f,  -0.5f,
    // LEFT
    -0.5f, -1.0f,  0.5f,
    -0.5f,  1.0f,  0.5f,
    -0.5f, -1.0f, -0.5f,
    -0.5f,  1.0f, -0.5f,
    // RIGHT
     0.5f, -1.0f, -0.5f,
     0.5f,  1.0f, -0.5f,
     0.5f, -1.0f,  0.5f,
     0.5f,  1.0f,  0.5f,
    // TOP
    -0.5f,  1.0f,  0.5f,
     0.5f,  1.0f,  0.5f,
     -0.5f,  1.0f, -0.5f,
     0.5f,  1.0f, -0.5f,
    // BOTTOM
    -0.5f, -1.0f,  0.5f,
    -0.5f, -1.0f, -0.5f,
     0.5f, -1.0f,  0.5f,
     0.5f, -1.0f, -0.5f,
};

Теперь я применяю glRotate() по осям x, y и z к этому блоку. Теперь я хочу изменить массив cubeVertex новыми координатами, полученными в результате применения вызова glRotate. Возможно ли это в OpenGL?

Ответы [ 3 ]

1 голос
/ 27 февраля 2010

Вообще говоря, OpenGL просто накапливает преобразования и фактически применяет их к данным только тогда, когда вы их визуализируете. В простом старом графическом конвейере с фиксированными функциями это сделать невозможно. Однако, поскольку программируемость растет с каждым поколением, теперь есть поддержка для этого с помощью расширений OpenGL, при условии, что вы используете достаточно свежую видеокарту. Независимо от того, есть ли у вас карта nVidia или ATI, это может иметь значение, поскольку они не всегда поддерживают одни и те же расширения.

Прошло много времени с тех пор, как я много работал с OpenGL, так что это будет немного расплывчато, но общая идея такова:

  • Вы связываете пару объектов буфера вершин,
  • поместите ваши данные в первый,
  • используйте Transform Feedback, чтобы преобразовать преобразованные вершины во вторую,
  • и вы можете затем прочитать данные из второго VBO в память.

Демонстрация фрактальной обратной связи nVidia Transform на их странице Примеры кода OpenGL должна помочь вам с реальным кодом для этого.

Если вы хотите сделать более общую математику на вашем GPU, вы должны изучить GPGPU техник, есть гораздо больше вещей, которые вы можете сделать, и с CUDA / OpenCL / и т.д. это становится намного проще кодировать тоже.

1 голос
/ 27 февраля 2010

Вы можете использовать glGet с GL_MODELVIEW_MATRIX, чтобы получить текущую матрицу просмотра модели (предполагается, что вы применили к ней вызов glRotate). Затем вручную преобразуйте свои вершины по матрице.

0 голосов
/ 27 февраля 2010

Это не тривиально, но посмотрите вверх glRenderMode(GL_FEEDBACK);, чтобы начать. Это даст вам не только координаты, но и (например) цвета после применения освещения.

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