将3D顶点投影到独立于OpenGL的屏幕坐标?

时间:2017-02-01 10:43:37

标签: opengl

我有一个顶点(x,y,z),我想计算在我的视口上渲染此点的屏幕位置。像Ray Picking这样的东西,或多或少相反。我不认为我可以使用gluProject,因为当我需要投影点时,我的矩阵会恢复到身份。

我想保持独立于OpenGL,所以没有额外的渲染通道。通过这种方式,我确信它只是像射线拾取一样的数学运算。我已经实现了那个并且效果很好,所以我想以相同的方式投影顶点。

当然我有相机pos,up和lookAt矢量和fovy。有关于此的任何信息来源吗?或者有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

如果您了解矩阵(或者至少知道如何构造它们),您可以通过将其位置与矩阵相乘然后执行视口转换来计算顶点的屏幕位置:

vProjected = modelViewPojectionMatrix * v;

if (
    // check that vertex shouldn't be clipped.
    -vProjected.w <= vProjected.x && vProjected.x <= vProjected.w &&
    -vProjected.w <= vProjected.y && vProjected.y <= vProjected.w &&
    -vProjected.w <= vProjected.z && vProjected.z <= vProjected.w
) {
    vProjected /= vProjected.w;

    vScreen.x = VIEWPORT_W * vProjected.x / 2 + VIEWPORT_CENTER_X;
    vScreen.y = VIEWPORT_H * vProjected.y / 2 + VIEWPORT_CENTER_Y;
}

请注意,根据OpenGL惯例,(0, 0)是左下角,而不是左上角。

任何带有verctor和matrix操作的数学库都可以帮助您。例如,mathfuglm

UPD。如何构建modelViewProjectionMatrix给定的摄像机位置和方向以及投影参数?我们需要两个矩阵(假设模型矩阵只是一个同一性,即世界坐标系中已经给定的顶点位置)。第一个是视图矩阵,它考虑了摄像机的位置和方向。在这里我会使用mathfu,因为我对它更熟悉,但几乎所有考虑到3D图形的数学库设计都具有相同的功能:

viewMatrix = mathfu::mat4::LookAt(
    cameraLookAtPosition,
    cameraPosition,
    cameraUpVector
);

第二个是投影矩阵:

projectionMatrix = mathfu::mat4::Perspective(fovy, aspect, zNear, zFar);

现在modelViewProjectionMatrix只是这两者的产物:

modelViewProjectionMatrix = projectionMatrix * viewMatrix;

请注意,矩阵乘法不是可交换的,换句话说A * B != B * A。因此,矩阵乘以的顺序非常重要。