c++ - OpenGL 3.0 窗口碰撞检测

标签 c++ opengl graphics glsl

谁能告诉我如何让三角形的顶点与屏幕的边缘发生碰撞? 对于数学库,我使用 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矩阵从世界空间转换到 View 空间,并通过从 View 空间到裁剪空间的 projection 矩阵。 gl_PositionHomogeneous coordinate在剪辑空间中并由 Perspective divide 进一步转换从剪辑空间到标准化设备空间。归一化设备空间是一个立方体,右、下、前为(-1, -1, -1),左、上、后为(1, 1, 1)。
此(体积)立方体中的所有几何体在视口(viewport)上都是“可见的”。

在剪辑空间中执行场景的剪辑。
如果 xyz 分量在倒置的 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/

相关文章:

c++ - Visual Studio SFML 教程图形显示不正确

c++ - 二维白色网格不显示在背景上方

java - 多个可点击的 JPanel

C++容器/迭代器依赖问题

c++ - 快速 1/X 除法(倒数)

c++ - 尽管传递了一个右值,为什么我的 move 构造函数没有被调用?

java - 我如何在opengl中画一个半圆

java - GLSL Shader 无法编译,Java 和 LWJGL 着色器错误

c++ - Qt 小部件中的选择区域

opengl - 图形管道的哪些部分是使用 CPU 和 GPU 完成的?