OpenGL - 我的球为什么不移动?

时间:2017-01-02 19:33:59

标签: c++ opengl math visual-studio-2015

在OpenGL中,我正在建立一个足球游戏,允许你通过首先移动高度指示器来左右拍摄球,然后在按下按钮时根据指示器进行拍摄。这是它的样子:

Football Game Visual

当移动这些指示器时,我的球需要在垂直指示器(y)的高度移动,如果是垂直指示器(x)则需要向左或向右移动。

首先,这是移动我的指标的代码(只是在我的RenderScene()函数中绘制的纹理)

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;
    }
}

我的足球移动计算

现在,为了让我的足球在移动指标后移动,我需要将以下计算应用于球的xyz轴:

  

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

     

其中θ= z-x中的角度,phi = z-y中的角度

因此,我试图首先获取theta和phi角度的值,只需根据你在SpecialKeys()函数中按下的高度指示器递增它们:

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
    }
}

既然我有角度,我想将计算出的值插入到drawFootball()参数中,顺便说一句,这个参数最初是在我的RenderScene函数中调用的......

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

......以下是我试图通过上述计算发球的方法:

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);
    }
}

但是当我点击启动按钮 F1 时,根本不会发生任何事情。我搞砸了哪里?

修改

如果有帮助,这是我的drawFootball()功能:

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();
}

1 个答案:

答案 0 :(得分:0)

首先确保您的thetaphi位于正确的单位,即Radians。如果在度数中使用sin(theta * PI/180.0f)等将它们转换为弧度,则假设已定义PI。

我相信你在计算的是Ball的方向向量。 d(x,y,z)是球应该行进的方向(假设没有重力或其他力)。它可能是踢球的方向。

我想如果你只是想移动你的球,你需要将这个方向乘以一个长度。由于您的球的半径为50个单位,请尝试将其转换为此半径的2倍。

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

这会将球移动到所需方向的半径的2倍。 但是你可能想要一些物理学来进行更逼真的运动。