2017-02-15 22 views
0

我想在OpenGL C++中创建一个具有在运行时显示立方体三面的项目。没有旋转需要看到三面。我对OpenGL很陌生,现在我的攻击计划一直在改变x,y和z值。我很好的在2D工作,但添加Z混合是我认为让我绊倒。我知道使用负值会使图像更接近相机并且更远离正面,但在我的代码中,当我更改Z值时,它对该对象没有任何影响。创建一个3D立方体,在运行时显示三条边,不旋转看所有三条边

我只在前面和右侧显示(运行),试图在绘制整个多维数据集之前先将这2个窗口置于窗口的正确位置。最初我以0.5或-0.5的比例将它们画出来,但只在屏幕上产生一个矩形。

所以我的主要问题是,是否有更简单的方法来预测每个顶点的行为?是的,我知道我在图形空间工作,但为什么当价值改变时,我的一些观点甚至不动?

#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 
#include <stdlib.h> //For exit function 

void exit(int); //To Exit Program 

void init(void) 
{ 
    glClearColor (0.0, 0.0, 0.0, 1.0); 
    glColor3f(1.0, 1.0, 1.0); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 
} 


void cube() 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

    glBegin(GL_QUADS); 

    glColor3f(1.0, 0.0, 0.0);  glVertex3f( 0.2, -0.3, -0.5);  // P1 is red lb 
    glColor3f(0.0, 1.0, 0.0);  glVertex3f( 0.3, 0.2, -0.5);  // P2 is green lt 
    glColor3f(0.0, 0.0, 1.0);  glVertex3f(-0.2, 0.3, -0.5);  // P3 is blue tt 
    glColor3f(1.0, 0.0, 1.0);  glVertex3f(-0.3, -0.2, -0.5);  // P4 is purple tb 

    glEnd(); 

// Green side - LEFT 
    glBegin(GL_QUADS); 
    glColor3f(0.0, 1.0, 0.0); 
    glVertex3f(-0.2, -0.3, 0.5); 
    glVertex3f(-0.3, 0.2, 0.5); 
    glVertex3f(-0.2, 0.3, -0.5); 
    glVertex3f(-0.3, -0.2, -0.5); 
    glEnd(); 

    glFlush(); 

} 

void myKeyboard(unsigned char theKey, int mouseX, int mouseY) 
{ 
    switch(theKey) 
    { 
     case 'Q': 
     case 'q': 
      exit(-1); //terminate the program 
     default: 
      break; // do nothing 

    } 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(640,480); 
    glutInitWindowPosition(100,150); 
    glutCreateWindow("Shapes: Q or q to quit"); 
    glutDisplayFunc(cube); 

    glutKeyboardFunc(myKeyboard); 

    init(); 
    glEnable(GL_DEPTH_TEST); 
    glutMainLoop(); 
} 

回答

0

问题不在于顶点的行为,而在于您使用的是正投影而不是透视图。如果你想继续使用古老的OpenGL,gluPerspective是你想要的,而不是glOrtho。如果你想移动到更现代的OpenGL,所有的矩阵数学函数都将被删除,所以你必须使用像glm这样的库来完成你所有的数学运算。

由于在正交投影中平行线保持平行,所以没有水平点或任何东西,因此产生了矩形。如果它位于或平行于矩形正面的边缘,则看不到它。透视投影更贴近地匹配摄像机如何看待世界,并行点最终会聚在远处。

想想这个的好方法是考虑一段非常长的直线铁轨。在正交投影中,你会看到两个导轨永远持续直线。在透视投影中,您最终会看到两条导轨在距离的一个点上相遇,并且还能够部分看到导轨的内边缘。

+0

这是很好的方式来说,这有力地帮助我更多地理解它。不幸的是,现在这是一个学校任务,我的教授只让我们使用glOrtho来完成作业。在寻找帮助的研究中,我发现大多数人使用数组来创建他们的立方体。我想这就是为什么我很难找到帮助,因为没有人使用过时的版本 – csm60

+0

是的,即时模式被顶点数组取代,比如1995年左右。耻辱,大多数计算机图形学课程仍然会这样教。 –

+0

如果这是只能通过glOrtho完成的任务,那么可能还有其他的东西丢失了。默认情况下,顶点的背面将被剔除。背面由顺时针或逆时针指定顶点的顺序决定。您可以禁用剔除,将前脸切换到另一个方向,或者确保所有四边形均按正确的顺序指定。更多详情:https://www.khronos.org/opengl/wiki/Face_Culling –