OpenGL ES:将矩阵转换为特定点

时间:2012-02-20 03:17:56

标签: iphone graphics opengl-es matrix

大家好我正在开发一款需要使用opengl es的app。不过我有一些问题。我的任务是旋转一个关于任意点的矩阵,比如说(0,0,0)。我做了一些关于谷歌的研究,最常见的方法是

  1. 将矩阵转换为(0,0,0)
  2. 旋转矩阵
  3. 将矩阵翻译回原始位置
  4. 有效

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

    然而我的问题是我使用的是opengl es 2.0。 opengl 2.0中不存在函数translatef。我有一个名为translateBy的函数,但我无法弄清楚如何使用translateBy函数将我的矩阵转换为某个点

    感谢任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在OpenGL ES 2.0中,您必须使用顶点着色器,并使用

更新每个帧中的模型视图矩阵
GLint modelviewmatrix = glGetUniformLocation(m_simpleProgram, "ModelviewMatrix");
matrx4 modelviewMatrix = rotation * translation;
glUniformMatrix4fv(modelviewmatrix, 1, 0, modelviewMatrix.Pointer());

假设matrx4为4x4的矩阵类。旋转和平移是用于旋转和平移的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(度,vector3轴)相当于

 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;
}