OpenGL - использование матрицы преобразования для определения проекции на плоскость

0

У меня есть рендеринг OpenGL, который является прямоугольным, т.е. Не имеет толщины. При управлении пользовательским интерфейсом для рендеринга может применяться ряд преобразований, таких как:

  • перевод
  • изменение размера
  • вращение (вокруг произвольной позиции поворота) и т.д.

В любой момент времени я могу получить матрицу преобразования, которая дает мне кумулятивный эффект любой из вышеупомянутых преобразований.

Как я могу использовать матрицу преобразования, чтобы определить расстояние между началом и проекцией любой точки рендеринга (скажем, центра) на плоскость z?

  • 1
    Вот указатель: 0xDEADBEEF не уверен, что это полезно;)
Теги:
opengl

1 ответ

2

Предполагая, что вы знакомы с матрицей и векторной алгеброй...

Концептуально вы должны сделать что-то вроде этого:

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);
}
  • ширина, высота - размеры вашего окна просмотра
  • TransformMatrix - должен быть продуктом ProjectionMatrix и ModelViewMatrix
  • центр - ваш интерес к локальным координатам объекта.

Если вы используете 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 в пикселях.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню