我正在学习OpenGL,我正在读一本书来帮助我很长时间。我已经完成了一半,并且已经决定在我熟悉基础知识的情况下走自己的路。我已经开始开发一个应用程序,目的是只显示一个网格。
我几乎把它钉了,但是当我运行我的应用程序时,部分网格被切断了。我附上了一个浓缩版本的代码(结果相同) - 有没有人知道我做错了什么让它切断了部分屏幕?我已经修改了很多并且我已经完成了一些值,但我无法将这个东西排序。非常感谢任何正确方向的帮助或推动。
代码:
#include <Windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "deps\glut\glut.h"
void display();
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(800, 600);
glutCreateWindow("");
glutDisplayFunc(display);
glClearColor(1.0, 1.0, 1.0, 1.0);
glColor3f(0.0, 0.0, 0.0);
// Init
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-8.0, 8.0, -8.0, 8.0, -8.0, 8.0);
glutMainLoop();
return 0;
}
void display() {
float f;
// Clear the screen
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0);
// This next bit of code just creates the grid
glColor3f(0.0f, 0.0f, 0.0f);
glPointSize(1.0);
for(f=-10.0f;f<10.0f;f++) {
glBegin(GL_LINES);
glVertex3f(f, 0.0f, -10.0f);
glVertex3f(f, 0.0f, 10.0f);
glEnd();
}
glRotatef(90, 0.0, 1.0, 0.0);
for(f=-10.0f;f<10.0f;f++) {
glBegin(GL_LINES);
glVertex3f(f, 0.0f, -10.0f);
glVertex3f(f, 0.0f, 10.0f);
glEnd();
}
// Swap the buffers
glutSwapBuffers();
}
答案 0 :(得分:3)
您无法在单位立方体之外绘制。
您的glOrtho
调用会缩放坐标,以便您可以将范围-8...8
用于x,y和z坐标,但您的for循环会尝试使用-10...10
,这超出了{{1}}范围将被剪裁。
答案 1 :(得分:1)
由于单位立方体的对角线长度比sqrt(3)
长,因此您达到了Z限制。因此,我建议您使用-14 ... 14(= ± round( 8*sqrt(3) )
)作为近平面和远平面的限制。