Как мне умножить вектор на "ModelViewProjectionMatrix" в openGL?
У меня есть строка в вершинном шейдере
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 ответ
Решение
Если у вас нет подходящей библиотеки векторов / матриц, загляните в 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] + ш * м [13] и т. Д.