C++ 如何获取旋转对象的新点(OpenGL)

C++ 如何获取旋转对象的新点(OpenGL),c++,opengl,matrix,rotation,C++,Opengl,Matrix,Rotation,这个想法很简单,但我似乎无法理解如何实施它。我将此图像链接以更好地理解我所说的内容:。我正在试着找到一个新的支点,我会把车转过来。我使用的是OpenGL,我已经计算出了我的车应该在哪里的坐标,就像图中一样,我把它绕着一个固定的轴旋转了阿尔法度。我使用了如下矩阵乘法: (100X)(C0S0)(100X) (0110年)(01100年)(0110年) (0 0 1 z)(-s 0 c 0)(0 0 1-z) (01)(01)(01)(01) 找到我正在做的运动的变换矩阵。我知道如果我有: glTr

这个想法很简单,但我似乎无法理解如何实施它。我将此图像链接以更好地理解我所说的内容:。我正在试着找到一个新的支点,我会把车转过来。我使用的是OpenGL,我已经计算出了我的车应该在哪里的坐标,就像图中一样,我把它绕着一个固定的轴旋转了阿尔法度。我使用了如下矩阵乘法:

(100X)(C0S0)(100X)

(0110年)(01100年)(0110年)

(0 0 1 z)(-s 0 c 0)(0 0 1-z)

(01)(01)(01)(01)

找到我正在做的运动的变换矩阵。我知道如果我有:

glTranslatef(xTemp,0,zTemp+R);  //T1
glRotatef(directie,0,1,0);      //R
glTranslatef(-xTemp,0,-zTemp-R); //T2
对于左转,我需要乘以T2*R*T1

场景示例:在我左转90*(如图所示)之后,我想从我到达的点(R)开始右转,如何找到新轴心点的坐标?我知道我必须以某种方式改变原点,使其在第一次旋转后正好位于我的物体所在的位置,但我被卡在这里了。 另外,角度不会总是90度

我将在下面发布相关代码:

void renderScene( void ) {

    glMatrixMode(GL_MODELVIEW); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(cameraX,cameraY,cameraZ,lookAtX,0,lookAtZ,upX, upY, upZ);


  glPushMatrix();

    if (steerLeft){
        glTranslatef(xTemp,0,zTemp+R); //xTemp,zTemp coordinates for the car before rotation
        glRotatef(angle,0,1,0);
        glTranslatef(-xTemp,0,-zTemp-R);    
    }
    else 
          if (steerRight){  
            glTranslatef(-xTemp,0,-zTemp-R);
            glRotatef(angle,0,1,0);
            glTranslatef(xTemp,0,zTemp+R);
          }
          else{ 
            glRotatef(angle,0,1,0);  //leave car in the rotated position
            glTranslatef(x1,0,z1);
        }
    glutWireCube(1);  // here I would draw my car, tires so that all the components are moved at the same time

  glPopMatrix(); 

  keyOperations(); //movement

  glutSwapBuffers();
}


void posL(GLdouble xTemp ,GLdouble y,GLdouble zTemp, GLdouble alfa ){ //used for testing to make sure the resulting coordinates are correct
    GLdouble pos[3];
    pos[1]=0;
    pos[0]= (zTemp)*sin(alfa*PI/180) +xTemp-(zTemp+R)*sin(alfa*PI/180);
    pos[2]=(zTemp)*cos(alfa*PI/180)+ (zTemp+R) - (zTemp+R)*cos(alfa*PI/180);

    // printf("x:%.2lf y:%.2lf z:%.2lf \n  ",pos[0],pos[1],pos[2]);
} //for left rotations  ( +angle  and zTemp+R )


 void posR(GLdouble xTemp ,GLdouble y,GLdouble zTemp, GLdouble alfa ){ //used for testing to make sure the resulting coordinates are correct
    GLdouble pos[3];
    pos[1]=0;
    pos[0]= (zTemp)*sin(-alfa*PI/180) +xTemp-(zTemp-R)*sin(-alfa*PI/180);
    pos[2]=(zTemp)*cos(-alfa*PI/180)+ (zTemp+R) - (zTemp-R)*cos(-alfa*PI/180);

    // printf("x:%.2lf y:%.2lf z:%.2lf \n  ",pos[0],pos[1],pos[2]);
} // for right rotations ( -angle  and zTemp-R )

void keyPressed(unsigned char key, int x, int y){
    keyStates[key]=true;
}

void keyUp(unsigned char key,int x, int y){
    keyStates[key]=false;
}

void keyOperations (void) {         

    if (keyStates['w']) { 
            if ((!keyStates['a'])&&(!keyStates['d'])){ //only moving forward

                //pos(0,0,0,90); test new coordinates for car after rotaion
                x1-=0.05;
                xTemp=x1; //stores current car position

                steerRight=false;
                steerLeft=false;
            }
    }  

    if (keyStates['s']) {
            if ((!keyStates['a'])&&(!keyStates['d'])){
                x1+=0.05;
                xTemp=x1;

                steerRight=false;
                steerLeft=false;
            }
    }  

    if ((keyStates['w']) && (keyStates['d'])) {
            steerRight=true;
            angle-=1;
    }

    if ((keyStates['w']) && (keyStates['a'])) {
            steerLeft=true;
            angle+=1;
            //printf("looking at: x:%.2lf z:%.2lf\n",x1,z1);
            x1= (zTemp)*sin(angle*PI/180) +xTemp-(zTemp+R)*sin(angle*PI/180);
            z1=(zTemp)*cos(angle*PI/180)+ (zTemp+R) - (zTemp+R)*cos(angle*PI/180);
    }

    if ((keyStates['s']) && (keyStates['d'])) {

            steerRight=true;
            sensMasina-=3;

            angle+=1;
    }

    if ((keyStates['s']) && (keyStates['a'])) {

            steerLeft=true;
            angle-=1;       
    }
} 
有效的东西:

  • 向前/向后移动
  • 从原点向左/向右转向(0,0,0)
不起作用的事情:

  • 从到达点转向后继续移动
总之,我的问题是:

1。当我想让我的车在R/L方向行驶时,如何将它设置为旋转的原点,这样我就可以轻松地计算我的轴点,如(xTemp,0,zTemp+R)

2。我是否需要在运动中的任何一点重置角度变量?

3。如何以不同的方式编写Push-Pop矩阵操作,以便在任何步骤“保存”汽车的位置,从而使其知道从何处开始新的转换?