OpenGL ES: перевести матрицу в конкретную точку - PullRequest
1 голос
/ 20 февраля 2012

Привет, ребята. Я работаю над приложением, которое требует использования OpenGLES.Однако у меня есть несколько вопросов.Моя задача - повернуть матрицу вокруг произвольной точки, скажем, (0,0,0).Я провел небольшое исследование в Google, и самый распространенный подход -

  1. . Перевести матрицу в (0,0,0)
  2. . Повернуть матрицу.вернуться в исходное положение

Эффективно

glTranslatef(centerX, centerY, centerZ);
glRotatef(angle, 0, 0, 1);
glTranslatef(-centerX, -centerY, -centerZ);

Однако моя проблема в том, что я использую opengl es 2.0.Функция translatef не существует в OpenGLES 2.0.У меня есть функция, которая называется translateBy, но я не могу понять, как использовать функцию translateBy для перевода моей матрицы в определенную точку

Спасибо, любая помощь будет признательна.

1 Ответ

0 голосов
/ 20 февраля 2012

В OpenGL ES 2.0 вы должны использовать вершинный шейдер и просто обновлять матрицу вида модели в каждом кадре, используя

GLint modelviewmatrix = glGetUniformLocation(m_simpleProgram, "ModelviewMatrix");
matrx4 modelviewMatrix = rotation * translation;
glUniformMatrix4fv(modelviewmatrix, 1, 0, modelviewMatrix.Pointer());

принимая матрикс 4 в качестве класса матрицы 4х4. а вращение и перемещение - это матричные объекты 4x4 для вращения и перемещения. Просто сделайте свои собственные функции перевода и поворота, Translatef (x, y, z) эквивалентно

  Matrx4 Translate( x,  y,  z)
{
    Matrx4 m;
    m = { 1, 0, 0, 0,
          0, 1, 0, 0,
          0, 0, 1, 0,
          x, y, z, 1 }
    return m;
}

и Rotatef (градус, ось вектора3) эквивалентны

 Matrx4 Rotate( float degree, vector3 axis)
{
    float radians = degrees * 3.14159f / 180.0f;
    float s = std::sin(radians);
    float c = std::cos(radians);

    Matrx4 m = Identity(); /// load identity matrix
    m[0] = c + (1 - c) * axis.x * axis.x;
    m[1] = (1 - c) * axis.x * axis.y - axis.z * s;
    m[2] = (1 - c) * axis.x * axis.z + axis.y * s;
    m[4] = (1 - c) * axis.x * axis.y + axis.z * s;
    m[5] = c + (1 - c) * axis.y * axis.y;
    m[6] = (1 - c) * axis.y * axis.z - axis.x * s;
    m[8] = (1 - c) * axis.x * axis.z - axis.y * s;
    m[9] = (1 - c) * axis.y * axis.z + axis.x * s;
    m[10] = c + (1 - c) * axis.z * axis.z;
    return m;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...