Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

OpenGL kamera problem #C

[es] :: 3D programiranje :: OpenGL kamera problem #C

[ Pregleda: 4657 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

becke
student
Tuzla, BiH

Član broj: 284117
Poruke: 3
31.47.16.*



Profil

icon OpenGL kamera problem #C30.04.2011. u 12:14 - pre 158 meseci
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.
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
*.static.isp.telekom.rs.

ICQ: 208550327


+14 Profil

icon Re: OpenGL kamera problem #C04.05.2011. u 09:01 - pre 158 meseci
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 )
{
....
}

EOF
 
Odgovor na temu

becke
student
Tuzla, BiH

Član broj: 284117
Poruke: 3
31.47.16.*



Profil

icon Re: OpenGL kamera problem #C04.05.2011. u 17:08 - pre 158 meseci
Kao i obicno, problem je nesto sto mi je bilo zadnje na pameti. :)
Hvala na ispravci!
 
Odgovor na temu

Nothingman

Član broj: 31375
Poruke: 308
*.teol.net.



+112 Profil

icon Re: OpenGL kamera problem #C06.05.2011. u 19:48 - pre 157 meseci
Nije mi jasno kako te okruzenje nije upozorilo o potencijalnom nenamernom zaklanjanju istoimenih promenjivih u opsegu?
Q: Are there really any systems where
void main() doesn't work?
A: It has been reported that programs using void main() can crash.
Q: The book I've been using, _C Programing for the Compleat Idiot_,
always uses void main().
A: Perhaps its author counts himself among the target audience.
 
Odgovor na temu

becke
student
Tuzla, BiH

Član broj: 284117
Poruke: 3
31.47.16.*



Profil

icon Re: OpenGL kamera problem #C09.05.2011. u 22:02 - pre 157 meseci
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?
 
Odgovor na temu

Nothingman

Član broj: 31375
Poruke: 308
95.180.105.*



+112 Profil

icon Re: OpenGL kamera problem #C20.05.2011. u 22:14 - pre 157 meseci
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 :)
Q: Are there really any systems where
void main() doesn't work?
A: It has been reported that programs using void main() can crash.
Q: The book I've been using, _C Programing for the Compleat Idiot_,
always uses void main().
A: Perhaps its author counts himself among the target audience.
 
Odgovor na temu

[es] :: 3D programiranje :: OpenGL kamera problem #C

[ Pregleda: 4657 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.