1

Тема: 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; 
}

2

Re: GLUT. Чо Frustrum не працює?

замінив frustum на glPerspective, і все робе, правда предмети все ще розтягуються