Autor Wątek: Kamera i środek układu współrzędnych  (Przeczytany 564 razy)

Offline senghe

  • Użytkownik

# Wrzesień 03, 2010, 12:24:18
Witam, dwa miesiące temu zacząłem zabawę z OpenGL, i natknąłem się na pewien problem związany z obrotem kamery.
W moim programie kamera działa na funkcji gluLookAt(), przesuwanie i obrót... I właśnie z obrotem jest problem.

Gdy stoję na środku układu, nie ruszam kamerą, to obrót jest dobry. Jednak, jeżeli poruszę się kamerą, to obrót jest, jednak kamera zatacza ósemkę wokół środka układu współrzędnych. Oto mój sposób obliczania obrotu:

     if(action == PLAYER_LOOK_AROUND){
        int MouseDelta = parameter1;
        this->angle += MouseDelta*0.8*RAD;
        this->lookingX = this->positionX + this->radius*cos(angle);
        this->lookingZ = this->positionZ + this->radius*sin(angle);
    }

     gluLookAt(this->positionX, this->positionY, this->positionZ, this->lookingX, this->lookingY, this->lookingZ, 0.0f, 1.0f, 0.0f);

Działa to na zasadzie okręgu

z równania okręgu obliczam nowy punkt, w który patrzy się kamera...

I jeszcze jeden problem. Po obrotach, gdy chcę zmienić pozycję kamery, jej układ się nie zmienia wraz z obrotem, więc chodzi ona po starych osiach... help :)

Po całodniowym szukaniu informacji zrezygnowałem z gluLookAt, i znalazłem coś takiego:
    if(action == PLAYER_GO_LEFT){
        this->positionX -= this->strafeAcc - float(cos(this->angle*RAD));
        //this->positionZ += float(cos(this->angle*RAD));
    }else if(action == PLAYER_GO_RIGHT){
        this->positionX += this->strafeAcc - float(cos(this->angle*RAD));
    }
    /* Chodzenie w przod i tyl */
    if(action == PLAYER_GO_FORWARD){
        this->positionZ += this->strafeAcc;

        this->positionX -= float(sin(this->angle*RAD));
        this->positionZ += float(cos(this->angle*RAD));
    }else if(action == PLAYER_GO_BACKWARD){
        this->positionZ -= this->strafeAcc;

        this->positionX += float(sin(this->angle*RAD));
        this->positionZ -= float(cos(this->angle*RAD));
    }

    /* Obracanie */
    if(action == PLAYER_LOOK_AROUND){
        int MouseDelta = parameter1;
        this->angle += MouseDelta*RAD;
    }
glRotatef(this->angle, 0, 1, 0);
glTranslatef(this->positionX*0.1, this->positionY*0.1, this->positionZ*0.1);

Chodzi konkretnie o te linijki z przesuwania sie w przod i tyl. Nie znalazlem przesuwania sie na boki, samemu kombinujac cos wygramolilem, jednak jest to bezsensowne... Jakby ktos cos pomogl, to czekam :)
« Ostatnia zmiana: Wrzesień 03, 2010, 19:05:16 wysłana przez senghe »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych