我正在尝试在OpenGL C ++中创建一个项目,该项目在运行时显示一个多维数据集的三面。看到三面都不需要轮换。我对OpenGL很陌生,我现在的攻击计划一直在改变x,y和z值。我在2d工作很好,但添加z混合是我认为绊倒我。我知道使用负值会使图像更接近相机并且更远离正面,但在我下面的代码中,当我更改Z值时,它对对象没有任何作用。
我只有正面和右边显示(运行)只是为了尝试在绘制整个立方体之前首先将这两个位于窗口中的正确位置。最初我用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 :(得分:0)
问题不在于顶点的行为,而在于您使用的是正交投影而不是透视投影。如果您想继续使用古老的OpenGL,gluPerspective
就是您想要的而不是glOrtho
。如果你想升级到更现代的OpenGL,所有的矩阵数学函数都会被删除,所以你必须使用像glm这样的库来代替所有的数学运算。
正在制作一个矩形,因为在正交投影中,平行线保持平行,因此没有地平线点或任何东西。如果它在矩形正面的边缘后面或平行,你就没有看到它。透视投影更接近于相机如何看待世界,平行点最终会聚在远处。
考虑这个问题的一个好方法是考虑一段很长的直线铁轨。在正交投影中,你会看到两条轨道永远直线延续。在透视投影中,您最终会看到两个导轨在距离的单个点处相遇,并且还能够部分地看到导轨的内边缘。