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 - Fatal编程技术网

C++ 如何设置在opengl中显示的卷

C++ 如何设置在opengl中显示的卷,c++,opengl,C++,Opengl,我试图显示一个特定的空间体积,从10,10,10到30,30,30的立方体。从我读到的每一件事来看,我会这样做: glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(10, 30, 10, 30, 10, 30); glMatrixMode(GL_MODELV

我试图显示一个特定的空间体积,从10,10,10到30,30,30的立方体。从我读到的每一件事来看,我会这样做:

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(10, 30, 10, 30, 10, 30);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(30.0f, 30.0f, 30.0f,
    20.0f, 20.0f, 20.0f,
    0.0f, 1.0f, 0.0f);

glColor3f(0.0, 0.0, 0.0);  //color = black
glPushMatrix();               
    glTranslated(20,20,20);
    glutSolidSphere(.3, 50, 50);
glPopMatrix();
glOrtho
设置了我能看到的音量,并且
glookat
说相机在30,30,30,并且指向20,20,20。但这不起作用。在一些帮助和一些游戏的帮助下,我通过以下代码成功地实现了这一点:

glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(10, 30, 10, 30, -1000, 1000);  //CHANGED THESE BOUNDS

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslated(20,20,20);                //ADDED THIS LINE 
gluLookAt(30.0f, 30.0f, 30.0f,
    20.0f, 20.0f, 20.0f,
    0.0f, 1.0f, 0.0f);


glPushMatrix();               
    glTranslated(20,20,20);
    glutSolidSphere(.3, 50, 50);
glPopMatrix();
为什么我需要这些改变?为什么第一个版本的代码不起作用?

此代码

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(10, 30, 10, 30, 10, 30);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(30.0f, 30.0f, 30.0f,
    20.0f, 20.0f, 20.0f,
    0.0f, 1.0f, 0.0f);
将设置一个矩阵,将长方体x=[10,30],y=[10,30]和z=[-10,-30]转换为[-1,1]^3剪辑空间体积(OpenGL的查看体积)。注意这里的负号

此代码

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(10, 30, 10, 30, 10, 30);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(30.0f, 30.0f, 30.0f,
    20.0f, 20.0f, 20.0f,
    0.0f, 1.0f, 0.0f);
设置(-30、-30、-30、-30)的所有对象的平移和一些旋转,以查看指定的方向

这两个矩阵都将被应用,首先是
模型视图
进入眼睛空间,然后是
投影
矩阵进入剪辑空间。所以现在,如果你想从一个全球“世界空间”的角度来思考,你最终会得到一个20个单位宽、高、深的观看量,但它位于你并不真正期望的地方。它将从设置为“视图方向轴”的位置开始,向后10个单位。也可以沿相机的局部x轴和y轴移动-指定相机要查看的点甚至不会出现在屏幕上

如果您只需要[10,30]^3查看卷,只需使用

glOrtho(10, 30, 10, 30, -10, -30);
然后一起移除
gluLookAt()
。这将至少适用于简单的情况,但它可能会搞砸照明和雾,因为“相机”现在处于原始状态。您可能想要设置一些对称的观看体积,这样您实际上可以设置任何正常的相机

编辑

更清楚地说:在投影矩阵中定义的查看体积是相对于该设置中的视图变换定义的。因此,例如,您可能需要一个尺寸为20x20x20的观察体积,其中您的观察轴位于投影的中心,并显示位于相机正前方的体积:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-10, 10, -10, 10, 0, 20);
现在,您可以像以前一样设置相机位置: glMatrixMode(GLU模型视图); glLoadIdentity(); gluLookAt(30.0f,30.0f,30.0f, 20.0f,20.0f,20.0f, 0.0f、1.0f、0.0f)

现在,点(20,20,20)(绘制球体的位置)将实际投影到屏幕的中心。但是,它不会位于观察窗的中心,因为它沿当前观察轴的范围为0到20个单位,但是(20,20,20)距离当前相机位置(30,30,30)17.32个单位。所以你可以把相机调成 gluLookAt(25.774f,25.774f,25.774f, 20.0f,20.0f,20.0f, 0.0f、1.0f、0.0f)


现在,该对象恰好位于观察体积的中心。

Ok,那么在
glOrtho()
之后,[10,30]^3被映射到[-1,1]^3,相机位于0,0,0,对吗?如果不使用
gluLookAt()
的话,我看到的东西是二维的,x轴是水平的,y轴是垂直的。我想从一个角度看东西,这样我就可以沿着所有3个轴看东西,但如果我试着把相机放在角落里看中央,它仍然不起作用:
gluLookAt(1,1,1,0,0,0,0,1,0)我想我还是误解了这个场景…@drowdemon:是的,你误解了。您现在似乎混淆了投影后的观看体积和投影前的观看体积。视图变换通常在投影之前应用。我更新了我的答案。