Как мне умножить вектор на «ModelViewProjectionMatrix» в openGL? - PullRequest
1 голос
/ 10 апреля 2011

У меня есть строка в вершинном шейдере

gl_Position  = gl_ModelViewProjectionMatrix * vertex;

Мне нужно выполнить те же вычисления без шейдера, как:

float vertex[4];
float modelviewProjection[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelviewProjection);
glMatrixMode(GL_PROJECTION_MATRIX);
glMultMatrixf(modelviewProjection);


for ( counter = 0; counter < numPoints; counter++ )
{

    vertex[0] = *vertexPointer + randomAdvance(timeAlive) + sin(ParticleTime); 
    vertex[1] = *( vertexPointer + 1 ) + randomAdvance(timeAlive) + timeAlive * 0.6f;
    vertex[2] = *( vertexPointer + 2 );
    glPushMatrix();
    glMultMatrixf(vertex);

    *vertexPointer = vertex[0];
    *( vertexPointer + 1 ) = vertex[1];
    *( vertexPointer + 2 ) = vertex[2];
    vertexPointer += 3;
    glPopMatrix();

}

1 Ответ

1 голос
/ 10 апреля 2011

Если у вас нет подходящей библиотеки векторов / матриц, загляните в GLM (она может делать такие вещи без суеты).

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

Таким образом, при условии размещения памяти OpenGL это будет:
x = x * m[0] + y * m [4] + z * m [8] + w * m [12], y = x * m [1] + y * m [5] + z * m [9] + w *м [13] и т. д.

...