2017-07-01 3 views
1

Ich versuche, Mini-Anwendung zu erstellen, die Kamera um einen Würfel mit Bewegung der Maus dreht. Es funktioniert perfekt beim Drehen um die Y-Achse, aber ich habe ein Problem mit der Drehung um die X-Achse. Wenn ich meine Maus kontinuierlich nach oben bewege, beginnt der Würfel sich in positiver X-Richtung zu drehen. Nach einiger Zeit kehrt es seine Drehrichtung um und beginnt sich in negativer X-Richtung zu drehen, dreht sich dann nach einiger Zeit wieder in positiver X-Richtung. Ich möchte es um das Positive X drehen lassen, solange ich meine Maus nach oben bewege. Was ist das Problem hier?Drehen der Kamera dreht sich nach einiger Zeit um

Der Würfel befindet sich in der Mitte des Koordinatensystems. Projektion Perspektive:

Edit: Hier ist das Video Problem verbunden: https://youtu.be/997ZdUM8fcQ

vec4 eye; 
vec4 at; 
vec4 up; 
GLfloat mouseX = -1; 
GLfloat mouseY = -1; 

// Bound to glutPassiveMotionFunc 
void mouse(int x, int y) { 
    // This rotation works perfect, cube rotates on same direction continuously as far as I move the mouse left or right 
    GLfloat acceleration_x = mouseX - x; 
    eye = RotateY(acceleration_x/10.f) * eye; 
    mouseX = x; 


    // This rotation doesn't work properly, after some time, cube's rotation direction inverses 
    GLfloat acceleration_y = mouseY - y; 
    eye = RotateX(acceleration_y/10.f) * eye; 
    mouseY = y; 


    // This part teleports pointer to opposite side of window after reaching window bounds 
    if (x >= 1364) { 
     glutWarpPointer(1, y); 
     mouseX = 1; 
    } 
    else if (x <= 0) { 
     glutWarpPointer(1363, y); 
     mouseX = 1363; 
    } 

    if (y >= 751) { 
     glutWarpPointer(x, 3); 
     mouseY = 3; 
    } 
    else if (y <= 2) { 
     glutWarpPointer(x, 750); 
     mouseY = 750; 
    } 
} 


void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    vec4 up(0.0, 1.0, 0.0, 0.0); 

    mat4 model_view = LookAt(eye, at, up); 
    glUniformMatrix4fv(ModelView, 1, GL_TRUE, model_view); 

    glDrawArrays(GL_TRIANGLES, 0, NumVertices); 
    glutSwapBuffers(); 
} 

// Bound to glutTimerFunc 
void timer(int id) 
{  
    glutPostRedisplay(); 
    glutTimerFunc(1000.f/60.f, timer, 0); 
} 

int main(int argc, char **argv) 
{ 
    ...... 
    ...... 

    eye = vec4(0, 0, 2, 0); 
    at = vec4(0, 0, 0, 0); 
    up = vec4(0.0, 1.0, 0.0, 0.0); 

    ..... 
    ..... 
} 

Antwort

1

Es ist, weil die Kamera gekippt wird. Verwenden Sie Ihre Hand so: Lassen Sie den Zeigefinger die dir sein, und Ihr Daumen ist up (thumb = (0, 1, 0)). Richten Sie den Indexfinder nach vorne und den Daumen nach oben. Nun fange an, deine Hand um X zu drehen: dein Zeigefinger beginnt nach unten zu zeigen, während dein Daumen nach vorne zeigt (dabei ist thumb.y positiv). Wenn Sie Ihre Hand um 90 Grad gedreht haben, zeigt der Zeigefinger nach unten und der Daumen zeigt nach vorne (thumb.y ist 0). Wenn Sie weiterdrehen, beginnt Ihr Daumen nach vorne + nach unten zu zeigen (thumb.y wird negativ).

In diesem Moment die LookAt Funktion wird die Matrix Sie wollten nicht berechnen, da Sie die up Vektor nach unten zeigen soll (wie gesagt, thumb.y negativ ist), aber in dem Code, up Vektor ist eine Konstante (0, 1, 0), so berechnet LookAt eine Matrix mit einer positiven up.y: Die Kamera wird umgedreht.

Eine Lösung könnte sein, dass Sie die erforderlichen Drehwinkel registrieren und die Kameramatrix (anstelle von dir) mit diesen Winkeln

drehen