如何根据场景最大和最小坐标设置glm :: ortho的界限?

时间:2014-08-09 16:57:33

标签: opengl math glm-math

我有一个三角形,在空间的任何地方都有3个顶点。

我试图获取它的最大和最小坐标。

void findBoundingBox(glm::vec3 & minBB, glm::vec3 & maxBB)
{
        minBB.x = std::min(minBB.x, mCoordinate.x);  
        minBB.y = std::min(minBB.y, mCoordinate.y);
        minBB.z = std::min(minBB.z, mCoordinate.z);
        maxBB.x = std::max(maxBB.x, mCoordinate.x);
        maxBB.y = std::max(maxBB.y, mCoordinate.y);
        maxBB.z = std::max(maxBB.z, mCoordinate.z);
    }
}

现在我试着设定  :

glm::vec3 InverseViewDirection(50.0f, 200, 200);  //Inverse View Direction
glm::vec3 LookAtPosition(0.0,0,0); // I can make it anywhere with barycentric coord, but this is the simple case
glm::vec3 setupVector(0.0, 1, 0);

我尝试设置正交视图以包裹三角形:

myCamera.setProjectionMatrix(min.x, max.x, max.y,min.y, 0.0001f, 10000.0f);

但在我看来,它并没有整齐地限制三角形。

我被困在这一天,任何指针?

错误:输出:(我希望视图整齐地绑定三角形)

enter image description here

编辑:

基于评论(我试图用视图矩阵更新边界(模型是标识,所以现在忽略它) 仍然没有运气:(

glm::vec4 minSS = ((myCamera.getViewMatrix()) * glm::vec4(minWS, 0.0));
glm::vec4 maxSS = ((myCamera.getViewMatrix()) * glm::vec4(maxWS, 0.0));

myCamera.setProjectionMatrix(minSS.x, maxSS.x, maxSS.y, minSS.y, -200.0001f, 14900.0f);

1 个答案:

答案 0 :(得分:1)

在计算边界框时,您需要将透视变换之前的所有变换应用到输入点。

在您的代码片段中,您似乎正在应用具有任意视点(50,200,200)的查看变换作为渲染的一部分。在将它们输入findBoundingBox()函数之前,您需要将相同的转换应用于输入点。

在更多数学术语中,您通常在顶点着色器中有类似的内容,InputPosition是原始顶点坐标:

gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * InputPosition;

要确定将所有点映射到给定范围的投影矩阵,您需要查看投影矩阵应用于的所有点。使用上面的符号,这些点是ViewMatrix * ModelMatrix * InputPosition。因此,当您计算边界框时,需要将模型和视图矩阵(或组合它们的模型视图矩阵)应用于输入点。