Тема: GLUT. Чо Frustrum не працює?
Хай. От є десь об'єкт, ага? І оцей фруструм, як я зрозумів, визначає область, котра відображається в вікні.
Він приймає 6 значень, left, right, top, bottom, near, far. Де top,right і т.д. визначають ширину та висоту області бачення, а near та far довжину.
Але чому, коли я навожу камеру на об'єкт і змінюю значення far та near - нічого не відбувається. Але якщо я від'їзджаю камерою назад, то об'єкт починає зникати. А от якщо near та far змінювати, то нічо
▼Прихований текст
#include <stdlib.h>
#include <gl\glut.h>
#include <stdio.h>
static float angle = 0;
static float scale = 1, eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz, left=1, right=1, bottom=1, top=1, near=1, far=10;
static bool dir = false;
//Ініціалізація
void init (void) {
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_SMOOTH);
} //Відображення
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
//Очистити матрицю
glLoadIdentity();
//Видова трансформація (камера)
gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz);
glPushMatrix();
//Модельна трансформація
/*glRotated(angle, 0, 1, 0);
glRotated(90, 1, 0, 0);
glScaled(scale, scale, scale);*/
glutWireSphere(1, 15, 15);
glutSwapBuffers();
glFinish();
}
// Зміна розмірів вікна
void reshape (int w, int h) {
glViewport(0,0,(GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(left,right,bottom,top,near,far);
}
void timerF(int value)
{
if (value == 0)
{
angle += 2;
if (dir)
{
scale -= 0.01;
if (scale <= 1)
dir = false;
}
if (!dir)
{
scale += 0.01;
if (scale >= 2)
dir = true;
}
display();
glutTimerFunc(16,timerF,0);
}
}
void keyFunc(unsigned char key, int x, int y)
{
system("cls");
printf("%c\n", key);
printf("Camera position:\n x\t y\t z\t \n %.1f \t %.1f \t %.1f \n", eyex,eyey,eyez);
printf("Camera look at:\n x\t y\t z\t \n %.1f \t %.1f \t %.1f\n", centerx, centery, centerz);
printf("Camera up is:\n x\t y\t z\t \n %.1f \t %.1f \t %.1f\n\n", upx, upy, upz);
printf("Frustrum is:\n near:\t far:\t left:\t right:\t top:\t bottom:\t\n %.1f\t %.1f\t %.1f\t %.1f\t %.1f\t %.1f\t ", near, far, left, right, top, bottom);
switch (key)
{
case 'w':eyez += 0.1; break;
case 's':eyez -= 0.1; break;
case 'a':eyex -= 0.1; break;
case 'd':eyex += 0.1; break;
case 'q':eyey -= 0.1; break;
case 'e':eyey += 0.1; break;
case 'W':centerz += 0.1; break;
case 'S':centerz -= 0.1; break;
case 'A':centerx -= 0.1; break;
case 'D':centerx += 0.1; break;
case 'Q':centery -= 0.1; break;
case 'E':centery += 0.1; break;
case 'u':upz += 0.1; break;
case 'j':upz -= 0.1; break;
case 'h':upx -= 0.1; break;
case 'k':upx += 0.1; break;
case 'y':upy -= 0.1; break;
case 'i':upy += 0.1; break;
case '+':near += 0.1; break;
case '-':near -= 0.1; break;
case '*':far += 0.1; break;
case '/':far -= 0.1; break;
case '7':left += 0.1; break;
case '4':left -= 0.1; break;
case '9':right += 0.1; break;
case '6':right -= 0.1; break;
case '8':top += 0.1; break;
case '5':top -= 0.1; break;
case '2':bottom += 0.1; break;
case '0':bottom -= 0.1; break;
default:
break;
}
}
int main (int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE); //set the display to Double buffer
glutInitWindowSize(1024, 720);
glViewport(0, 0, 1024, 720);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyFunc);
glutTimerFunc(16, timerF, 0);
glutMainLoop(); //call the main loop
return 0;
}