[ becke @ 30.04.2011. 12:14 ] @
Dakle, problem je slijedeci:
Potrebno mi je pomjeranje kamere po svim osama (x, y, z).
Koristio sam funkciju gluLookAt i realizovao pomjeranje cajnika po z osi te rotaciju kamere.
Na isti nacin (promjenom parametara gluLookAt funkcije pomocu tastature) sam pokusao realizovati pomjeranje po x i y osama, ali iz nekog razloga pritiskom na tipke koje bi trebale kontrolisati pomjeranje po tim osama ne dobijam nikakav odziv. U isto vrijeme, pomjeranje po z radi kako treba.
Kod koji sam do sad napisao je dat u nastavku.

Code:
#include <windows.h>
#include <GL/glut.h>
#include <math.h>

void display();
float angle;
float angle3 = 0.0;
float lx = 0.0, lz = -1.0, ly = 0.0;
float x = 0.0, z = 1.0, y = 1.0;
float fraction = 0.1;

void kbd(unsigned char key, int x, int y) {
    switch(key) {
        case 27:
            exit(0);
            break;
        case 'a':
        case 'A':
            angle += 0.1;
            if(angle > 360)
                angle -= 360;
            break;
        case 'd':
        case 'D':
            angle -= 0.1;
            if(angle < 0)
                angle += 360;
            break;
        case 'f':
        case 'F':
            angle3 -= 0.1;
            lx = sin(angle3);
            lz = -cos(angle3);
            break;
        case 'h':
        case 'H':
            angle3 += 0.1;
            lx = sin(angle3);
            lz = -cos(angle3);
            break;
        case 'g':
        case 'G':
            //x += lx * fraction;
            z += fraction;
            break;
        case 't':
        case 'T':
            //x -= lx * fraction;
            z -= fraction;
            break;
        case 'j':
        case 'J':
            x -= fraction;
            break;
        case 'l':
        case 'L':
            x += fraction;
            break;
        case 'i':
        case 'I':
            y += fraction;
            break;
        case 'k':
        case 'K':
            y -= fraction;
            break;
    }
    glutPostRedisplay();
}

int main(int argc, char** argv){
    glutInit(&argc,argv);
    glutInitWindowSize(1000, 800);
    glutCreateWindow("Cajnik");
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

void display() {
    glClear (GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 15.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0, 0.0, -2.0);
    glRotatef(angle, 0.0, 0.0, 1.0);
    gluLookAt(x, y, z,
              x + lx, y, z + lz,
              0.0, 1.0, 0.0);
    glutWireTeapot(1.0);
    glutKeyboardFunc(kbd);
    glFlush();
}

Izvinjavam se unaprijed ako je bila slicna tema, ja je nisam pronasao.
Unaprijed hvala svima na pomoci.
[ glorius @ 04.05.2011. 09:01 ] @
Problem je ovde:

Code:


float x = 0.0, z = 1.0, y = 1.0;

void kbd(unsigned char key, int x, int y)
{
    .....

    case 'j':
        case 'J':
            x -= fraction;
            break;
        case 'l':
        case 'L':
            x += fraction;
            break;
        case 'i':
        case 'I':
            y += fraction;
            break;
        case 'k':
        case 'K':
            y -= fraction;
            break;
}



x i y su ti definisani globalno i lokalno unutar kbd() funkcije. Funkcija menja lokalne x i y promenljive umesto, kako bi ti ocekivao, globalne x i y promenljive.

Promeni nazive parametara kbd() funkcije i to ce resiti problem:

void kbd(unsigned char key, int a, int b )
{
....
}
[ becke @ 04.05.2011. 17:08 ] @
Kao i obicno, problem je nesto sto mi je bilo zadnje na pameti. :)
Hvala na ispravci!
[ Nothingman @ 06.05.2011. 19:48 ] @
Nije mi jasno kako te okruzenje nije upozorilo o potencijalnom nenamernom zaklanjanju istoimenih promenjivih u opsegu?
[ becke @ 09.05.2011. 22:02 ] @
Iskreno, nije ni meni jasno, ali Code::Blocks mi nije dao nikakvo upozorenje niti prijavio gresku.

Mozda bi trebao otvoriti zasebnu temu, ali prvo cu pitati ovdje.
Citao sam da je moguce ukljuciti opciju "backface culling" unutar koda. Pretrazivanjem po Googleu sam vidio da se to radi pomocu glEnable(GL_CULL_FACE), medjutim gdje god u kodu pozovem tu funkciju nista se ne desava te se iscrtava i zadnja strana cajnika.
Da li prije omogucavanje backface cullinga treba jos nesto uraditi da bi ta opcija radila i gdje u kodu bi trebao pozvati funkciju koja to omogucava?
[ Nothingman @ 20.05.2011. 22:14 ] @
A gde pozivas tacno tu funkciju? Okaci source tog primera gde ti ne radi. Imas nekoliko povezanih funkcija koji omogucavaju podesavanje cullinga po zelji. Pored te koju si naveo imas jos i glFrontFace i glCullFace.

Moguce je da nisi dobro definisao back facing poligone, tj. da nisi bio konzistentan prilikom postavljanja temena koja cine poligon (npr. neki su ti clockwise a drugi counterclockwise). Moguce je da si glEnable pozvao unutar glBegin-glEnd bloka, pa komanda nema efekta.

Zato je najbolje da postavis kod, da bih mogao preciznije da ti odgovorim :)