OpenGL - 使用变换矩阵确定投影到平面上

时间:2014-11-25 17:37:25

标签: c++ c opengl

我有一个OpenGL渲染,它是矩形的,即没有厚度。通过UI控件,可以对渲染应用许多变换,例如:

  • 翻译
  • 调整大小
  • 旋转(围绕任意枢轴位置)等

在任何时间点,我都可以得到变换矩阵,它给出了所应用的任何上述变换的累积效果。

如何使用变换矩阵来确定渲染(例如,中心)到z平面上任何点的原点和投影之间的距离?

1 个答案:

答案 0 :(得分: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的产品
  • center - 您对本地“对象”坐标感兴趣的点。

如果您使用的是OpenGL< 3.0或OpenGL ES< 2.0然后上面的矩阵可以通过以下方式确定:

float modelview[16], projection[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
glGetFloatv(GL_PROJECTION_MATRIX, projection);

所有OpenGL都提供了视口尺寸:

int viewport[4]; // width = viewport[2], height = viewport[3]
glGetIntegerv(GL_VIEWPORT, viewport);

您还可以使用一些oldskull GLU函数: gluProject() - >计算由ModelView和&amp ;;转换的点位置。以像素为单位的投影和视口。