为什么我不能移动3D立方体? OpenGL的

时间:2014-05-06 00:02:32

标签: c++ opengl rotation transform cube

我的代码是关于创建2个立方体,然后同时旋转它们,同时移动它们,并同时缩放它们。对于旋转和缩放它们起作用,但移动不起作用。我认为这与我的glTranslatef()有关,但我尝试了所有我知道的方式。

原点是窗口的中心,立方体总是在旋转。

片段代码:

    static GLfloat x = 0.0f;
    static GLfloat y = 0.0f;

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

        glLoadIdentity();
        glTranslatef(-(1.5f + x), y + 0.5f, 0.3f);
        glScalef(xScale, yScale, zScale);
        glRotatef(theta[0], 1.0, 0.0, 0.0);
        glRotatef(theta[1], 0.0, 1.0, 0.0);
        glRotatef(theta[2], 0.0, 0.0, 1.0);
        colorcube();
        glFlush();

        glLoadIdentity(); 
        glTranslatef(1.5f + x, y + 0.5f, 0.3f);
        glScalef(xScale, yScale, zScale);
        glRotatef(theta[0], 1.0, 0.0, 0.0);
        glRotatef(theta[1], 0.0, 1.0, 0.0);
        glRotatef(theta[2], 0.0, 0.0, 1.0);
        colorcube();

        glFlush();
        glutSwapBuffers();
    }

    void spinCube()
    {
        // idle callback, spin cube 2 degrees about selected axis
        if (negative == true) theta[axis] -= 0.5;
        else  if (negative == false) theta[axis] += 0.5;
        if (theta[axis] > 360.0) theta[axis] -= 360.0;
        //display();
        glutPostRedisplay();
    }

void actionKeys(unsigned char key, int x, int y ) 
{
    switch (key)
    {
case 'r': case 'R': 
            x += 0.5f;
            glutPostRedisplay();
            break;
        case 'l': case 'L':
            x += 0.5f;
            glutPostRedisplay();
            break;
        case 'u': case 'U':
            y += 0.5f;
            glutPostRedisplay();
            break;
        case 'd': case 'D':
            y -= 0.5f;
            glutPostRedisplay();
            break;
}
}

1 个答案:

答案 0 :(得分:1)

问题在于actionKeys函数中的变量范围。您有名为x和y的全局变量,函数参数也称为x和y。在actionKeys函数内部,函数参数x和y是正在更新的函数,而不是全局函数。这就是为什么你的运动不起作用的原因,因为永远不会更新x和y全局变量。我建议重命名全局变量,使其具有与函数参数不同的命名约定,以便将来不再遇到此问题。全局变量的常见命名约定是在它们前面添加g(对于全局变量),这样就不会遇到与局部变量的命名冲突。