c++ - OpenGL-计算NDC中的位置可在着色器中使用,但不能在 'regular'程序中使用

标签 c++ math opengl glm-math

我目前正在与opengl一起进行2d-sicescrolling jump'n'run。我目前要检查敌人是否显示在屏幕上,以停止对不可见的敌人进行碰撞计算。为此,我检查每帧中NDC在x轴和y轴上的位置是否在[-1,1]之间。
这是通过以下方法完成的:

bool Enemy::checkWithCameraArea(glm::mat4 cameraView, glm::mat4 proj, glm::vec3 scale) {
    glm::mat4 model = glm::mat4(1.0f);
    model = glm::translate(model, position);
    model = glm::scale(model, scale);
    glm::vec4 posInClip = proj * cameraView * model * glm::vec4(position, 1.0f);
    glm::vec3 posDehom = glm::vec3(posInClip.x / posInClip.w, posInClip.y / posInClip.w, posInClip.z / posInClip.w);

    if (posDehom.x <= 1.0f && posDehom.x >= -1.0f &&
        posDehom.y <= 1.0f && posDehom.y >= -1.0f) {
        return true;
    }

    return false;
}
View 矩阵的计算如下:glm::lookAt(_position, _position + _front, _up);和这样的投影矩阵:glm::perspective(45.0f, (float)Width / (float)Height, 5.0f, 15.0f);这些值基于相机向右移动的每一帧进行更新。
在我的顶点着色器中使用相同的值将位置转换为剪贴空间,并且从渲染 Angular 看一切正常。但是,对于每个敌人的计算似乎只在一开始就起作用。如果摄像机向右移动,则由我的“checkWithCameraArea”方法计算出的区域似乎会滞后。因此,仍会计算出屏幕左侧的敌人,而尚未计算出从右侧进入屏幕的敌人。请帮助我,我不知道我的错误在哪里。
编辑#1
删除具有缩放比例的行,因为这对于单个位置没有意义(如注释中所指出)。既然有人问,我要检查的位置是左下角。但是当整个对象都在屏幕上时,我遇到的问题仍然存在,可以看到here。在此视频中,我直观地看到了问题:checkWithCameraArea-Method的结果确定是绘制敌人纹理(为真)还是绘制绿色框(为假)

最佳答案

如用户BDL的注释中所指出的,我将位置两次应用(一次在转换中,一次与MVP相乘)。我还删除了缩放比例,因为它对于单个点而言不是必需的。
该方法现在看起来像这样,可以按我的需要工作:

bool Enemy::checkWithCameraArea(glm::mat4 view, glm::mat4 proj) {
    glm::vec4 posInClip = proj * view * glm::vec4(position, 1.0f);
    glm::vec3 posDehom = glm::vec3(posInClip.x / posInClip.w, posInClip.y / posInClip.w, posInClip.z / posInClip.w);

    if (posDehom.x <= 1.0f && posDehom.x >= -1.0f &&
        posDehom.y <= 1.0f && posDehom.y >= -1.0f) {
        return true;
    }

    return false;
}

关于c++ - OpenGL-计算NDC中的位置可在着色器中使用,但不能在 'regular'程序中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62693076/

相关文章:

java - 修复 LWJGL 3 和 Slick-Util 之间的不兼容性

c++ - 如何检查派生类的可调用成员函数是否存在?

c++ - 推断拥有成员函数的类的类型

c++ - 为什么 g++(4.6 和 4.7)将这个除法的结果提升为 double ?我能阻止吗?

Java基数转换程序给定值、其基数和新基数

c# - 如何查看一个对象是否在 4 个点内

mysql - 两个整数mysql的汉明距离

c++ - GL_UNSIGNED_SHORT_5_6_5 未声明?

c++ - 从 btScalar 矩阵获取方向 vector

c++ - 为什么 _ftscanf_s 会抛出异常而 _ftscanf 不会?