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