2017-01-02 4 views
0

In OpenGL, baue ich ein Fußballspiel, mit dem Sie einen Ball schießen können, indem Sie zuerst Höhenanzeiger nach links und rechts bewegen, bevor Sie basierend auf den Anzeigen, wenn eine Taste gedrückt wird, schießen. Hier ist, wie es aussieht:OpenGL - Warum bewegt sich mein Ball nicht?

Football Game Visual

Wenn diese Indikatoren bewegen, mein Ball muss auf der Höhe der vertikalen Anzeige (y), und nach links oder rechts Richtung, wenn die vertikale (x) reisen.

Erstens, hier ist der Code, der meine Indikatoren bewegt (die in meiner RenderScene() Funktion gerade gezogen Texturen werden)

void SpecialKeys(int key, int x, int y){ 

if (key == GLUT_KEY_RIGHT) {  // moves the bottom indicator RIGHT 
     horizontalBarX += 5.0f; 
    } 

    if (key == GLUT_KEY_LEFT) { 
     horizontalBarX -= 5.0f; // moves the bottom indicator LEFT 
    } 

    if (key == GLUT_KEY_UP) { // moves the top indicator UP 
     verticalBarY += 5.0f; 
     verticalBarX += 1.0f; 
    } 

    if (key == GLUT_KEY_DOWN) { // moves the top indicator DOWN 
     verticalBarY -= 5.0f; 
     verticalBarX -= 1.0f; 
    } 
} 

Berechnungen für meinen Fußball

Jetzt zu bewegen meinen Fußball zu erhalten, bewegen, nachdem die Indikatoren bewegt wurden, muss ich die folgenden Berechnungen auf die x, y und z Achse des Balls anwenden:

x = sin (theta) * cos (phi) y = cos (theta) * sin (phi) z = cos (theta)

wobei Theta = Winkel in zx und phi = Winkel in zy

Also mit diesem, habe ich versucht, zuerst die Werte beider theta und phi-Winkel zu bekommen, indem man sie einfach erhöht wird, je nachdem, welche Höhe Indikatoren, die Sie in der SpecialKeys() Funktion gedrückt haben:

void SpecialKeys(int key, int x, int y){ 

if (key == GLUT_KEY_RIGHT) {  // moves the bottom indicator RIGHT 
     horizontalBarX += 5.0f; 
     theta += 5; // Increase theta angle by 5 
    } 

    if (key == GLUT_KEY_LEFT) { 
     horizontalBarX -= 5.0f; // moves the bottom indicator LEFT 
     theta -= 5; // Decrease theta angle by 5 
    } 

    if (key == GLUT_KEY_UP) { // moves the top indicator UP 
     verticalBarY += 5.0f; 
     verticalBarX += 1.0f; 
     phi += 5; // Increase theta angle by 5 
    } 

    if (key == GLUT_KEY_DOWN) { // moves the top indicator DOWN 
     verticalBarY -= 5.0f; 
     verticalBarX -= 1.0f; 
     phi -= 5; // Decrease phi angle by 5 
    } 
} 

Jetzt, Ich habe die Winkel, ich will das berechnen einstecken d-Werte in die drawFootball() Parameter, die durch die Art und Weise zunächst in meiner RenderScene Funktion als ...

drawFootBall(0, 40, 500, 50); // x,.y, z, r 

genannt wird ... und hier sind, wie ich bin versucht, den Ball mit den Berechnungen zu starten oben:

void SpecialKeys(int key, int x, int y){ 

    // indicator if statements just above this line 

    if (key == GLUT_KEY_F1) { 
     drawFootBall(sin(theta)*cos(phi), cos(theta)*sin(phi), cos(theta), 50); 
    } 
} 

Aber wenn ich gehen die Start-Taste F1 klicken, passiert nichts bei allen. Wo habe ich versagt?

EDIT:

Wenn es hilft, ist hier meine drawFootball() Funktion:

void drawFootBall(GLfloat x, GLfloat y, GLfloat z, GLfloat r) 
{ 
    glPushMatrix(); 
    glFrontFace(GL_CCW); 
    glTranslatef(x,y,z); 
    //create ball texture 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_BALL]); 
    //glDisable(GL_LIGHTING); 
    glColor3f(0.5,0.5,0.5); 
    quadricFootball = gluNewQuadric(); 
    gluQuadricDrawStyle(quadricFootball, GLU_FILL); 
    gluQuadricNormals(quadricFootball, GLU_SMOOTH); 
    gluQuadricOrientation(quadricFootball, GLU_OUTSIDE); 
    gluQuadricTexture(quadricFootball, GL_TRUE); 
    gluSphere(quadricFootball, r, 85, 50); 
    glDisable(GL_TEXTURE_2D); 
    glPopMatrix(); 
} 
+0

Es wird sehr schwer sein, Ihnen zu helfen, ohne zu sehen, was drawFootBall() tut. – Frank

+0

Hallo @Frank, Ich habe meine Frage für Sie mit meiner Funktion drawFootball() bearbeitet. –

+0

Ihre Winkel sollten im Bogenmaß und nicht in Grad angegeben werden. Fünf Radianten sind fast 360 Grad. – molbdnilo

Antwort

0

Zum einen stellen Sie sicher, Ihre theta und phi in den richtigen Einheiten das heißt Radiant sind. Wenn sie in Grad umgerechnet werden, indem man sin(theta * PI/180.0f) und so weiter verwendet, unter der Annahme, dass PI definiert ist.

Ich glaube, was Sie dort berechnen, ist ein Richtungsvektor für den Ball. Die d(x,y,z) ist die Richtung, in der sich der Ball bewegen sollte (vorausgesetzt, es gibt keine Schwerkraft oder andere Kräfte). Es ist wahrscheinlich die Richtung, in der der Ball getreten wird.

Ich denke, wenn Sie einfach Ihren Ball bewegen wollten, müssen Sie diese Richtung mit einer Länge multiplizieren. Da Ihr Ball einen Radius von 50 Einheiten hat, versuchen Sie es mit dem 2-fachen Radius.

glTranslatef(2.0f*r*x,2.0f*r*y,2.0f*r*z); 

Dies wird den Ball auf den 2-fachen Radius in die gewünschte Richtung bewegen. Allerdings möchten Sie wahrscheinlich etwas Physik haben, um eine realistischere Bewegung zu haben.

+0

Danke für diese Antwort, das macht Sinn. Nur ein paar kurze Fragen. Mit diesem glTranslate, in welcher Funktion setze ich das ein (ich nehme meine RenderScene-Funktion an, will aber nur sicher sein). Außerdem schließe ich im Grunde jede Berechnung an eine x, y, z Variable an und verwende sie in der glTranslate? –

+0

Wie kann ich diese Übersetzung auch nur machen, wenn die F1-Taste gedrückt wird? –

+0

Idealerweise würden Sie den Ball jedes Mal zeichnen, anstatt nur wenn F1 gedrückt wird. Speichern Sie die Übersetzung einfach in einer Variablen und inkrementieren Sie entsprechend oder verwenden Sie ein Flag und übersetzen Sie nur, wenn das Kontrollkästchen aktiviert ist. – Harish

Verwandte Themen