如何在3D环境中移动对象?

时间:2020-10-16 15:51:54

标签: c++ opengl glut

我正在尝试创建3D四边形并四处移动。我不知道四边形的方向。

这是我到目前为止的代码:

void draw(){
    glPushMatrix();
    //update the central point of the quad
    newX = 0.5 + xr; 
    newZ = -1.0 + zr;

    glTranslatef(newX, 0.0, newZ);
    glRotatef(robotAngle, 0.0, 1.0, 0.0);
    glTranslatef(-newX, 0.0, -newZ);
    drawQuad();
    glPopMatrix();
}

void drawQuad(){
    glPushMatrix();
    // Front
    glBegin(GL_QUADS);
    glColor3f(1.0f, 0.0f, 0.0f);    
    glVertex3f(0.0f + xr, 0.0f, 0.0f + zr);
    glVertex3f(1.0f + xr, 0.0f, 0.0f + zr);
    glVertex3f(1.0f + xr, 1.0f, 0.0f + zr);
    glVertex3f(0.0f + xr, 1.0f, 0.0f + zr);
    glEnd();
    // Back
    glBegin(GL_QUADS);
    glColor3f(1.0f, 0.0f, 0.0f);     
    glVertex3f(0.0f + xr, 0.0f, -2.0f + zr);
    glVertex3f(1.0f + xr, 0.0f, -2.0f + zr);
    glVertex3f(1.0f + xr, 1.0f, -2.0f + zr);
    glVertex3f(0.0f + xr, 1.0f, -2.0f + zr);
    glEnd();

    glColor3f(1, 0, 1);
    glBegin(GL_QUAD_STRIP);
    glVertex3f(0.0f + xr, 0.0f, 0.0f + zr);
    glVertex3f(0.0f + xr, 0.0f, -2.0f + zr);

    glVertex3f(1.0f + xr, 0.0f, 0.0f + zr);
    glVertex3f(1.0f + xr, 0.0f, -2.0f + zr);

    glVertex3f(1.0f + xr, 1.0f, 0.0f + zr);
    glVertex3f(1.0f + xr, 1.0f, -2.0f + zr);

    glVertex3f(0.0f + xr, 1.0f, 0.0f + zr);
    glVertex3f(0.0f + xr, 1.0f, -2.0f + zr);
    glEnd();
}

void specialkey(unsigned char key, int x, int y)
{
    switch (key) {
    case 's':
        robotAngle += 1.0;
        glutPostRedisplay();
        break;
    case 'S':
        robotAngle -= 1.0;
        glutPostRedisplay();
        break;
        }
}

void directionkey(int key, int x, int y)
{
    switch (key) {
    case GLUT_KEY_LEFT:
        xr -= 0.05;
        glutPostRedisplay();
        break;
    case GLUT_KEY_RIGHT:
        xr += 0.05;
        glutPostRedisplay();
        break;
   }
}

四边形可以在其原始位置绕其中心点旋转。但是,一旦我开始移动四边形,它只会沿x轴移动,而不是四边形的方向。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

请勿通过xrzr修改顶点坐标:

glVertex3f(0.0f + xr, 0.0f, 0.0f + zr);

glVertex3f(0.0f, 0.0f, 0.0f);

旋转模型后,使用glTranslatef移动模型。在下面的pivotXpivotZ中,常数a不变:

void draw(){
    
    float pivotX = 0.5f; // center of the model
    float pivotZ = -1.0f;

    glPushMatrix();
    
    glTranslatef(xr, 0.0, zr);

    glTranslatef(pivotX, 0.0, pivotZ);
    glRotatef(robotAngle, 0.0, 1.0, 0.0);
    glTranslatef(-pivotX, 0.0, -pivotZ);
    
    drawQuad();
    
    glPopMatrix();
}

矩阵乘法与Commutative的顺序无关。