У меня есть рендеринг OpenGL, который является прямоугольным, т.е. Не имеет толщины. При управлении пользовательским интерфейсом для рендеринга может применяться ряд преобразований, таких как:
В любой момент времени я могу получить матрицу преобразования, которая дает мне кумулятивный эффект любой из вышеупомянутых преобразований.
Как я могу использовать матрицу преобразования, чтобы определить расстояние между началом и проекцией любой точки рендеринга (скажем, центра) на плоскость z?
Предполагая, что вы знакомы с матрицей и векторной алгеброй...
Концептуально вы должны сделать что-то вроде этого:
float Distance(int width, int height const mat4& TransformMatrix, const vec2& center)
{
vec4 point(center,0,1);
vec4 transformed = TransformMatrix * point;
float w = transformed.w;
if (abs(transformed.x)>w || abs(transformed.y)>w || abs(transformed.z)>w)
return -1.0; // point is out of clipping volume
vec4 projected = transformed / transformed.w;
projected.x *= width *0.5;
projected.y *= height *0.5;
// assuming origin point is in viewport center
return length(projected.x,projected.y);
}
Если вы используете OpenGL <3.0 или OpenGL ES <2.0, то над матрицами можно определить:
float modelview[16], projection[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
glGetFloatv(GL_PROJECTION_MATRIX, projection);
Размеры Viewport доступны во всех OpenGL:
int viewport[4]; // width = viewport[2], height = viewport[3]
glGetIntegerv(GL_VIEWPORT, viewport);
Вы также можете использовать некоторые функции GLU oldskull: gluProject() → вычисляет позицию точки, преобразованную ModelView & Projection и viewport в пикселях.
0xDEADBEEF
не уверен, что это полезно;)