【问题标题】:How to moving an object around in 3D environment? [duplicate]如何在 3D 环境中移动物体? [复制]
【发布时间】:2020-10-16 15:51:54
【问题描述】:

我正在尝试创建一个 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 轴移动,而不是我的四边形所面对的方向。

我该如何解决这个问题?

【问题讨论】:

  • 如果你想改变z位置,那么你需要改变zr。如何改变 xr 和 zr 以使机器人朝着它所面对的方向前进?为此,是时候进行一些数学运算了!
  • @tadman 这是一种绕原点以外的点旋转的简单方法
  • @user253751 是的,我现在正试图找出方向向量,我的四边形的中心点是 x 和 z 点。
  • @user253751 很公平。我想我已经习惯了照顾父母。
  • @KanzakiAriaEcho pivotXpivotZ 依赖于 xrzr。当您更改xrzr 时,您也必须更改pivotXpivotZ

标签: c++ opengl glut


【解决方案1】:

不要通过xrzr修改顶点坐标:

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

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

在模型旋转后使用glTranslatef 移动模型。在下面pivotXpivotZ 是不变的,不要改变:

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顺序很重要。

【讨论】:

  • 对不起,我只是编辑了我的问题,这是一个错字,我应该把 newXnewZ 放在 glTranslatef
  • @KanzakiAriaEcho 是的,我知道,无论如何这个答案就是解决方案。不要改变轴心,也不要改变顶点。使用单个glTranslatef 将模型移动xrzr
  • 那么我应该用什么替换pivotX
  • 你的意思是pivotXpivotZ 是我四边形的中心点吗?
  • 是的,我的四边形的中心点是(0.5,0.0,-1.0)
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多