【问题标题】:OpenGL - Using transformation matrix to determine projection onto a planeOpenGL - 使用变换矩阵来确定平面上的投影
【发布时间】:2015-01-23 20:06:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这是一个指针:0xDEADBEEF 不确定它是否有帮助 ;)

标签: c++ c opengl


【解决方案1】:

假设您熟悉矩阵和向量代数...

从概念上讲,您应该这样做:

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

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 & Projection 和视口转换的点位置(以像素为单位)。

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2011-02-22
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多