Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在OpenGL中设置摄影机_C++_Opengl_Sdl - Fatal编程技术网

C++ 在OpenGL中设置摄影机

C++ 在OpenGL中设置摄影机,c++,opengl,sdl,C++,Opengl,Sdl,我做游戏引擎已经有一段时间了。我开始只使用SDL进行2D图形,但通过使用OpenGL,我慢慢地向3D功能迈进。我看到的大多数关于“如何完成事情”的文档都使用GLUT,而我没有使用GLUT 问题是如何在OpenGL中创建一个可以在3D环境中移动并正确显示3D模型和精灵(例如,具有固定位置和旋转的精灵)的“摄影机”。为了在OpenGL camera中设置相机,我应该关注哪些函数?它们应该以什么顺序被调用 下面是一些背景信息,这就是为什么我想要一台真正的相机 为了绘制一个简单的精灵,我从SDL曲面创建

我做游戏引擎已经有一段时间了。我开始只使用SDL进行2D图形,但通过使用OpenGL,我慢慢地向3D功能迈进。我看到的大多数关于“如何完成事情”的文档都使用GLUT,而我没有使用GLUT

问题是如何在OpenGL中创建一个可以在3D环境中移动并正确显示3D模型和精灵(例如,具有固定位置和旋转的精灵)的“摄影机”。为了在OpenGL camera中设置相机,我应该关注哪些函数?它们应该以什么顺序被调用

下面是一些背景信息,这就是为什么我想要一台真正的相机

为了绘制一个简单的精灵,我从SDL曲面创建了一个GL纹理,并在(SpriteX-CameraX)和(SpriteY-CameraY)的坐标处将其绘制到屏幕上。这很好,但当移动到实际的3D模型时,它并不完全正确。摄影机位置是一个自定义向量类(即不使用标准库),包含X、Y、Z整数组件

我有一个由三角形组成的3D立方体,我可以自己画它并旋转它,我可以在画模型时通过相机位置移动立方体(尽管方式很尴尬),并使用位置向量的组件来计算模型的位置。但是,当我旋转模型时,这种方法的问题变得很明显。模型的原点不是模型本身,而是屏幕的原点。谷歌搜索告诉我需要保存模型的位置,围绕原点旋转,然后将模型恢复到原始位置

我想我应该创建一个OpenGL“camera”,而不是传入相机的位置,并通过计算新的顶点来计算应该在视口中绘制的位置要为我做到这一点,我需要做的就是将我的相机对象的坐标传递到OpenGL相机中,它会自动转换视图。如果您使用GLUT,这项任务似乎非常简单,但我不确定如何仅使用OpenGL设置相机

编辑#1(在一些评论之后): 根据一些建议,下面是在整个程序中调用的update方法。它已更新为创建透视图和视图矩阵。所有绘图都发生在调用此之前。当OpenGL执行时(减去缓冲区交换),会执行一组类似的方法。x、y、z坐标是摄影机及其位置向量的直线实例。如果相机位于(256,32,0),则256,32和0将被传递到更新方法中。目前,z设置为0,因为目前无法更改该值。正在绘制的三维模型是一组位于X=320、Y=240、Z=-128位置的顶点/三角形+法线。当程序运行时,这是在模式中绘制的,然后在模式中绘制,然后在模式中绘制另一个,当我将相机稍微向右移动时。原因可能是法线,但我认为更多的是因为我忽略了一些非常重要的东西,或者没有完全理解glFrustum的远近参数的实际作用

在实现这些更改之前,我使用的是glOrtho和正确渲染的立方体。现在,如果我切换回glOrtho,一个面渲染(绿色),旋转非常奇怪-可能是因为平移。立方体有6种不同的颜色,每边一种。红色、蓝色、绿色、青色、白色和紫色

int VideoWindow::Update(double x, double y, double z)
{
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

    glFrustum(0.0f, GetWidth(), GetHeight(), 0.0f, 32.0f, 192.0f);


    glMatrixMode( GL_MODELVIEW );

    SDL_GL_SwapBuffers();  
    glLoadIdentity();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glRotatef(0, 1.0f, 0.0f, 0.0f);
    glRotatef(0, 0.0f, 1.0f, 0.0f);
    glRotatef(0, 0.0f, 0.0f, 1.0f);
    glTranslated(-x, -y, 0);

    return 0;
}
编辑最终版本:
问题是glFrustum的近参数和远参数以及glFrustum的Z值。虽然“更改值”已经修复了它,但我可能还需要进一步了解这两个函数之间的关系。

您需要一个视图矩阵和一个投影矩阵。您可以使用以下两种方法之一:

  • 使用自己的库计算矩阵后,使用
    glMatrixMode()
    glLoadMatrixf()
    自己加载矩阵

  • 使用
    glMatrixMode(GL\u MODELVIEW)
    glTranslate()
    /
    glRotate()
    组合创建视图矩阵,使用
    glMatrixMode(GL\u投影)
    glrustum()
    组合创建投影矩阵。请记住-视图矩阵是相机位置的负平移(因为它是相对于相机原点移动世界的位置),以及应用的任何旋转(俯仰/偏航)


  • 希望这有帮助,如果我有更多的时间,我会给你写一个适当的例子

    对于对象层次结构,必须使用矩阵堆栈


    但是相机在层次结构中,所以在绘制对象之前,你必须在堆栈上进行逆变换,因为openGL只使用从3D到相机的矩阵。

    如果你没有检查,那么可能正在看下面的项目将详细解释“tsalter”在他的文章中所写的内容

    来自OGL SDK(CodeColony)


    另外,请参阅红皮书,了解有关查看的说明,以及模型视图和投影矩阵如何帮助您创建摄影机。它从实际相机和对应于OpenGL API的相机之间的良好比较开始

    谢谢你朝着正确的方向努力。如果你能看看我的代码和截图,我已经在帖子中做了编辑。有些地方不太正确:)实际上,问题在于我为glFrustum的近参数和远参数选择的值以及传递到glFrustum的Z值。谢谢