繁体   English   中英

OpenGL 3.0窗口碰撞检测

[英]OpenGL 3.0 Window Collision Detection

有人可以告诉我如何使三角形顶点与屏幕边缘碰撞吗? 对于数学库,我使用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是剪辑空间中的gl_Position 坐标 ,并通过从剪辑空间到归一化设备空间的Perspective划分进一步转换。 规范化的设备空间是一个多维数据集,具有(-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个顶点坐标进行此操作-

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM