OpenGL 3.0窗口碰撞检测



有人能告诉我如何使三角形顶点与屏幕边缘碰撞吗?对于数学库,我使用GLM,对于窗口创建和键盘/鼠标输入,我使用了GLFW。我创建了透视矩阵和三角形顶点的简单数组。

然后我在顶点着色器中乘以所有这些,比如:

gl_Position = projection * view * model * vec4(pos, 1.0);

投影矩阵定义为:

glm::mat4 projection = glm::perspective(
45.0f, (GLfloat)screenWidth / (GLfloat)screenHeight, 0.1f, 100.0f);

我有完全工作的相机和投影。我可以在我的"世界"里移动,看到三角形站在那里。我遇到的问题是,我想确保三角形与屏幕的边缘发生碰撞。

我所做的是禁用相机,只启用键盘移动。然后将平移矩阵初始化为glm::translate(model, glm::vec3(xMove, yMove, -2.5f));,将缩放矩阵初始化为0.4。

现在所有这些都很好。当我按下RIGHT时,三角形向右移动当我按下UP时,三角形向上移动等等…问题是我不知道如何让它停止移动,然后它碰到边缘。

这就是我尝试过的:

triangleRightVertex.xglm::vec3对象。

0.4是我在缩放矩阵中使用的缩放值。

if(((xMove + triangleRightVertex.x) * 0.4f) >= 1.0f)
{
cout << "Right side collision detected!" << endl; 
}

当我将三角形向右移动时,当第三个顶点(三角形的右下角(的x与右侧碰撞时,它确实检测到碰撞,但在检测到之前,它会稍微超出。但当我试着向上移动时,当三角形的一半向上时,它检测到了碰撞。

我不知道在这里该怎么办,有人能给我解释一下吗?

三角形的每个顶点坐标都由model矩阵从模型空间转换到世界空间,由view矩阵从世界空间转换到视图空间,并由projection矩阵从视图空间转换到剪裁空间。gl_Position是剪辑空间中的齐次坐标,并通过从剪辑空间到归一化设备空间的透视划分进一步变换。规范化的设备空间是一个立方体,右、下、前为(-1,-1,-1(,左、上、后为(1,1,1(
此(体积(立方体中的所有几何体在视口中都"可见"。

在剪辑空间中执行场景的剪辑
如果xyz分量在由点的齐次坐标的反转w分量和w分量定义的范围内,则点处于剪辑空间中:

-w <=  x, y, z  <= w

您要做的是检查三角形的顶点x坐标是否被剪裁。因此,您必须检查剪辑空间坐标的x分量是否在视图体积中。

计算CPU上顶点的剪辑空间位置,就像计算顶点着色器一样。glm库非常适合这样的东西:

glm::vec3 triangleVertex = ... ; // new model coordinate of the triangle
glm::vec4 h_pos = projection * view * model * vec4(triangleVertex, 1.0);
bool x_is_clipped = h_pos.x < -h_pos.w || h_pos.x > h_pos.w;

如果你不知道model矩阵和view矩阵是如何变换三角形的方向的,那么你必须对三角形的所有3个顶点坐标进行变换——

最新更新