谁能告诉我如何让三角形的顶点与屏幕的边缘发生碰撞? 对于数学库,我使用 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.x
是 glm::vec3
对象。
0.4 是我在缩放矩阵中使用的缩放值。
if(((xMove + triangleRightVertex.x) * 0.4f) >= 1.0f)
{
cout << "Right side collision detected!" << endl;
}
当我向右移动三角形时,当第三个顶点(三角形的右下角)的 x 与右侧发生碰撞时,它会检测到碰撞,但在检测到之前它会超出一点点。但是当我尝试向上移动时,它会在三角形的一半向上时检测到碰撞。
我不知道该做什么,有人可以解释一下吗?
最佳答案
三角形的每个顶点坐标通过model
矩阵从模型空间转换到世界空间,通过view
矩阵从世界空间转换到 View 空间,并通过从 View 空间到裁剪空间的 projection
矩阵。 gl_Position
是 Homogeneous coordinate在剪辑空间中并由 Perspective divide 进一步转换从剪辑空间到标准化设备空间。归一化设备空间是一个立方体,右、下、前为(-1, -1, -1),左、上、后为(1, 1, 1)。
此(体积)立方体中的所有几何体在视口(viewport)上都是“可见的”。
在剪辑空间中执行场景的剪辑。
如果 x
、y
和 z
分量在倒置的 w
定义的范围内,则点在裁剪空间中> 分量和点齐次坐标的w
分量:
-w <= x, y, z <= w
您要做的是检查三角形的顶点 x
坐标是否被剪裁。所以你必须检查剪辑空间坐标的 x
组件是否在 View 体积中。
计算顶点在 CPU 上的裁剪空间位置,就像顶点着色器一样。 glm library非常适合这样的事情:
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 个顶点执行此操作三角形的坐标-
关于c++ - OpenGL 3.0 窗口碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53423548/