Когда я запускаю свою программу, просто просматривая ось XYZ, иногда кажется, что перспектива меняется.
Чаще всего это выглядит этот.
Но иногда это выглядит этот.
На первом изображении все на переднем плане намного меньше. Тогда как на втором изображении все выглядит примерно одинакового размера. Я предпочитаю второе изображение, но я не знаю, что происходит!
Вот мой код:
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
{
if (height == 0) // Prevent A Divide By Zero By
{
height = 1; // Making Height Equal One
}
glViewport(0, 0, width, height); // Reset The Current Viewport
aspectRatio = (GLfloat)width / (GLfloat)height;
screenHeight = (GLfloat)height;
screenWidth = (GLfloat)width;
}
int InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(1.0f, 1.0f, 1.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
return TRUE; // Initialization Went OK
}
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{
//3D setup
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity(); // Reset The Projection Matrix
gluPerspective(45.0f, aspectRatio, 0.1f, 500.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
//3D stuff
glTranslatef(-8.0f*aspectRatio, 0.0f, -zoomInOut); // Move and zoom axes
glRotatef(rotateLeftRight, 0.0f, 1.0f, 0.0f); // Rotations
glRotatef(rotateUpDown, 1.0f, 0.0f, 0.0f);
//axes
glLineWidth(1.0);
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_LINES);//x axis
glVertex3f(-20.0, 0.0, 0.0);
glVertex3f(20.0, 0, 0);
glEnd();
glBegin(GL_LINES);//y axis
glVertex3f(0.0, 20.0, 0.0);
glVertex3f(0.0, -20.0, 0);
glEnd();
glBegin(GL_LINES);//z axis
glVertex3f(0.0, 0.0, 20.0);
glVertex3f(0.0, 0.0, -20.0);
glEnd();
//2D setup
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, screenWidth, 0, screenHeight); //left,right,bottom,top
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//2D overlay goes here
return TRUE; // Keep Going
}
Что я сделал, чтобы изменить то, как выглядят оси?
Я не вижу ничего плохого в вашем коде.
Ваш код перевода немного странный glTranslatef(-8.0f*aspectRatio, 0.0f, -zoomInOut);
Вы находитесь на линии X = -8, Y = 0 и называете свою координату Z zoomInOut
, Который не зум, а позиция. Это так же, как если бы вы находились в лифте с внешним видом, и вы смотрите на фонтан в центре площади в нижней части здания, вы не увеличиваете масштаб, вы просто смотрите ближе (как это).
Чтобы сделать реальный зум, вы должны изменить угол поля зрения (первый параметр gluPerspective
).
Вы рисуете 3 линии от -20 до 20 над осями X, Y и Z.
На ваших скриншотах мы почти видим их от одного конца до другого. Там нет странного зажима (ваши пределы Z от gluPerspective
хороши [0.1f, 500.0f]).
Тот факт, что ваш мозг иногда не видит перспективу, это не ошибка, это просто потому, что вы смотрите на плоское изображение только с двумя цветами (без тени, тумана …).
«3D» изображения (из OpenGl & co.) — просто король оптических иллюзий, а программа, которую вы написали, просто создает плохую иллюзию.
Бедный, но правильный! Это хорошее начало.