Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 5 odgovora
  • 5.602 pregleda

Najnovija ↓

OpenGL kamera problem #C 30.04.2011. u 13:14 · pre 188 meseci #1
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.
Re: OpenGL kamera problem #C 04.05.2011. u 10:01 · pre 188 meseci #2
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 )
{
....
}
Potpis
EOF
Re: OpenGL kamera problem #C 04.05.2011. u 18:08 · pre 188 meseci #3
Kao i obicno, problem je nesto sto mi je bilo zadnje na pameti. :)
Hvala na ispravci!
Re: OpenGL kamera problem #C 06.05.2011. u 20:48 · pre 188 meseci #4
Nije mi jasno kako te okruzenje nije upozorilo o potencijalnom nenamernom zaklanjanju istoimenih promenjivih u opsegu?
Potpis
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.
Re: OpenGL kamera problem #C 09.05.2011. u 23:02 · pre 188 meseci #5
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?
Re: OpenGL kamera problem #C 20.05.2011. u 23:14 · pre 188 meseci #6
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 :)
Potpis
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.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme