我有一个三角形,在空间的任何地方都有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);
但在我看来,它并没有整齐地限制三角形。
我被困在这一天,任何指针?
错误:输出:(我希望视图整齐地绑定三角形)
编辑:
基于评论(我试图用视图矩阵更新边界(模型是标识,所以现在忽略它) 仍然没有运气:(
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);
答案 0 :(得分:1)
在计算边界框时,您需要将透视变换之前的所有变换应用到输入点。
在您的代码片段中,您似乎正在应用具有任意视点(50,200,200)的查看变换作为渲染的一部分。在将它们输入findBoundingBox()
函数之前,您需要将相同的转换应用于输入点。
在更多数学术语中,您通常在顶点着色器中有类似的内容,InputPosition
是原始顶点坐标:
gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * InputPosition;
要确定将所有点映射到给定范围的投影矩阵,您需要查看投影矩阵应用于的所有点。使用上面的符号,这些点是ViewMatrix * ModelMatrix * InputPosition
。因此,当您计算边界框时,需要将模型和视图矩阵(或组合它们的模型视图矩阵)应用于输入点。