【问题标题】:2D Camera using OpengGl使用 Opengl 的 2D 相机
【发布时间】:2016-03-20 14:47:12
【问题描述】:

我正在编写一个 2D 小游戏,我想实现一个相机,当他移动时跟随角色。 不幸的是,当我移动角色时,我的实现结果是黑屏......如果你知道我的错误在哪里,你能帮助我吗?我是openGl的新手。

这是我的主要代码:

int main(int argc, char** argv) {

glutInit (&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(300, 350);

glutCreateWindow("Map");
init();
glutDisplayFunc(drawMap);
glutSpecialFunc(specialkeyboard);

glutIdleFunc(moveObjects);
glutMainLoop();
return 0;
}

绘制地图的函数: 无效的绘图() {

//int x=0;
//Initialisation
glClear (GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluOrtho2D(0.0,500.0,0.0,500.0); 
glViewport(0,0,1000,700); 

// drawing the rest of the map //

这里是相机代码,我认为问题来自相机功能。

void camera() {


float left = C.x - (300/2.0); 
float  bottom = C.y - (350/2.0); 

float  right = left + 300;
float  top = bottom + 350;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(left, right, bottom, top); 
glMatrixMode(GL_MODELVIEW);

}

还有特殊键盘功能:

void specialkeyboard(int key, int x, int y)
{
switch (key) {
    case GLUT_KEY_UP:
        C.y += 2;
        camera();
        break;
    case GLUT_KEY_DOWN:
        C.y -= 2;
        camera();
        break;
    case GLUT_KEY_RIGHT:
        C.x += 2;
        camera();
        break;
    case GLUT_KEY_LEFT:
        C.x -= 2;
        camera();
        break;
}
glutPostRedisplay();
}

非常感谢您的帮助:)

编辑

所以现在的问题是地图向错误的方向移动,它与角色一起移动但没有跟随他。 (红圈是人物)

主要代码:

int main(int argc, char** argv) {

glutInit (&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500, 700);
glutCreateWindow("Map");
init();
glutDisplayFunc(drawMap);
glutSpecialFunc(specialkeyboard);

glutIdleFunc(moveObjects);
glutMainLoop();
return 0;
}

绘制地图:

void drawMap()
{
std::cout << "Debut Drawmap " << std::endl;
//TRY
glClear (GL_COLOR_BUFFER_BIT);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluOrtho2D(0.0,500.0,0.0,500.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
}

//drawing the map//

// Red circle
C.DrawCircle();
camera();
glutSwapBuffers ();
std::cout << "Fin drawmap " << std::endl;    
}

还有相机:

  void camera(){  
  glViewport(C.x,0,1000,700);
  }

【问题讨论】:

    标签: c++ opengl camera


    【解决方案1】:

    一旦你的camera() 函数被调用,你就会应用两个glOrtho() 矩阵,这肯定不是你想要的。

    固定函数 GL 会将乘积 Projection * ModelView 应用于您绘制的每个顶点。最初,Projection 将是身份,因此它不会产生任何影响,并且您将 ModelView 设置为 Ortho2D(0.0,500.0,0.0,500.0)。

    当您在该状态下绘制时,x=0 的顶点坐标将映射到视口的左边缘,x=500 将映射到右边缘。但是,这只是这种情况,因为 GL 将始终在应用矩阵后应用视口变换。 Ortho2D 实际上所做的是创建比例和平移,以便将眼睛空间中的观看体积转换为一个 立方体,从 -1 到 NDC 空间中的所有维度。

    现在当你也将投影矩阵设置为正交时,你会有以下效果:

    ModelView 会将 x=0 转换为 -1 并将 x=500 转换为 1。然后,应用投影,它将基于相机的 left 映射到 -1 和 left + 300 到 1。如果您的 @987654334 @ 和 C.y 那时两者都为零,您的图像将缩小到原始大小的 1/300 和 1/350。但是由于您至少将相机位置增加或减少了两个单位 - 由于第一个 Ortho2D 现在正好是原始图像区域的大小 - 您保证该点不再出现在屏幕上。

    说了这么多,我可以给几个建议:

    1. 切勿将正交矩阵放入 ModelView 堆栈。它不适合那样使用。
    2. 只需在投影矩阵上保留一个正交调用,并取决于您的相机位置。
    3. 忘记关于glMatrixMode、gluOrtho2D 等的一切。十年来,这些在 GL 中已弃用。 OpenGL 的现代核心配置文件根本不支持该功能。如果您现在开始学习 OpenGL,请不要再为上一个千年前有意义的旧内容而烦恼。了解使用可编程管道的正确方法。

    【讨论】:

    • 感谢您的帮助和解释。我在上一篇文章中编辑了代码中的更改。现在的新问题是地图随角色移动,但不随角色移动。就像角色向右移动时,地图需要向左移动,这里地图也向右移动
    • @Flore:你不能修改视口,这与任何事情都没有关系。你实际上想像一开始那样更新正交调用,你只需要完全替换你的另一个正交调用。
    • 所以你的意思是在drawmap函数中我应该删除我的glortho(并放置一个viewPort?)。在我的相机功能中,我应该放 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(左、右、下、上); glMatrixMode(GL_MODELVIEW);有一个 glortho 并且根本没有视口?
    • 你需要设置一个视口。但它完全独立于相机。
    • 如果我理解得很好,正交 2D 会创建一个比例,所以我需要在函数 drawmap 中定义我的比例,并通过视口定义我的地图在屏幕上的大小。 “你只需要完全替换你的另一个正交调用”是什么意思,我有点迷茫
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多