2010-08-29 78 views
0

*我说的转动它自己的轴的对象,但我认为我的任期是错误的...我的意思是想从物体转动我的对象中心,而不是在起源GLUT矩阵乘法旋转在其自己的轴旋转对象,而不使用glRotate

我想做一个程序,在其自己的轴旋转我的对象(使用矩阵的点/顶点),而不使用glRotate或glTranslate 我所做的是使一个MatrixMultiplication功能和在X,Y旋转对象3个独立的功能和Z轴以及它们翻译使用矩阵和矩阵乘法功能的另一功能:

void MMMultiplication(float fVector[], float fMatrix[]) 
{ 
    float tmpFloat; 
for(int a = 0; a <= 72; a+=4)//this is 72 because the elements of my object's matrix 
           is also 72 
{ 
     for(int indx2= 0; indx2 < 4; indx2++) 
     { 
      tmpFloat = 0.0f; 
      for(int indx = 0; indx < 4; indx++) 
    { 
     tmpFloat = tmpFloat + 
     (fVector[indx+a] * fMatrix[(indx*4) + indx2]); 
    } 
    fVector[indx2+a] = tmpFloat; 
} 
} 

} 

和另外3个代表xy和z旋转矩阵的函数以及一个平移矩阵。

该程序会要求x,y,z坐标在那里转换对象,然后您可以使用z,x,c键盘按钮分别在x,y,z轴上旋转它,它会旋转对象其*自身轴线

我要做的就是打电话说,绘制对象RenderScene一个功能,我使用glutKeyboard功能在X,Y,Z轴旋转我的对象......

到目前为止,我程序只会在原点中正确旋转我的对象。如果我尝试在其他地方翻译主题,每当我按z,x或c时,它最终会“添加”到翻译中......我明白,我需要先将对象翻译成原点,然后再将其翻译回原点我说,它结束了翻译越走越远

反正这里是我用来使它工作至今代码...

void main(int argc, char **argv) 
{ 

cout<<"Input:(x,y,z)"; 
cin>>arbitrary[0]; 
cin>>arbitrary[1]; 
cin>>arbitrary[2]; 
arbitrary[3] = 1.0f; 
TranslateMatrix(initalpos,object,arbitrary[0],arbitrary[1],arbitrary[2]); 




glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 
glutInitWindowPosition(100,100); 
glutInitWindowSize(1024,768); 
glutCreateWindow("Rotation"); 

glutReshapeFunc(changeSize); 

Lighting(false); 
glutKeyboardFunc(processNormalKeys); 
glutSpecialFunc(inputKey); 

glutDisplayFunc(renderScene); 
glutTimerFunc(0,Timer,0); 

// Enable Depth Testing 
glEnable(GL_DEPTH_TEST);  

glutMainLoop(); 

getch(); 
return; 



_getch(); 
return; 
} 

void renderScene() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 






    glPushMatrix(); 
    DrawObject(object); 
    glPopMatrix(); 


    glutSwapBuffers(); 

} 

void rotatex(float xangle) 
{ 
    glPushMatrix(); 
    TranslateVector(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]); 
    RotateX(object, xangle);//this is my x-axis rotation 
    TranslateMatrix(object,initalpos,arbitrary[0], arbitrary[1], arbitrary[2]); 
    glPopMatrix(); 
    return; 
} 

void rotatey(float yangle) 
{ 
    glPushMatrix(); 
    TranslateVector(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]); 
    RotateY(object, yangle);//this is my y-axis rotation matrix 
    TranslateMatrix(object,initalpos,arbitrary[0] ,arbitrary[1],arbitrary[2]); 
    glPopMatrix(); 
    return; 
} 

void rotatez(float zangle) 
{ 
    glPushMatrix(); 
    TranslateVector(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]); 
    RotateZ(object, zangle);//this is my z-axis rotation matrix matrix 
    TranslateMatrix(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]); 
    glPopMatrix(); 
    return; 
} 

void TranslateMatrix 
    (float fSVector[],float fEVector[], float fX, float fY, float fZ) 
{ 
    float fTranslationMatrix[16]; 

    for (int indx = 0; indx < 16; indx++) 
    { 
    fTranslationMatrix[indx] = 0; 
    } 
    fTranslationMatrix[0] = 1; 
    fTranslationMatrix[5] = 1; 
    fTranslationMatrix[10] = 1; 
    fTranslationMatrix[15] = 1; 

    fTranslationMatrix[12] = fX; 
    fTranslationMatrix[13] = fY; 
    fTranslationMatrix[14] = fZ; 

    MMMultiplication(fSVector, fTranslationMatrix); 
    MMMultiplication(fEVector, fTranslationMatrix); 
} 

void processNormalKeys(unsigned char key, int x, int y) 
{ 

    switch(key) 
    { 
    case 27: 
     exit(0); 
    case 'X': 
    case 'x': 
     { 
      rotatex(0.5f);break; 

     } 
    case 'c': 
    case 'C': 
     { 
      rotatey(0.5f);break; 

     } 
    case 'Z': 
    case 'z': 
     { 
      rotatez(0.5f);break; 

     } 
    } 
} 

任何想法?

+0

可以添加TranslateVector函数的代码?当翻译增加时,它似乎是一个错误的符号(翻译成原点,然后通过倒转符号翻译回来)。 – dyp 2010-08-29 18:34:23

+0

我找到了解决方案......实际上我不能将它翻译成原点...... 我可以通过将它翻译为 - 他们的位置然后将它们翻译回来:D – PhoenixNoob121 2010-08-30 03:03:36

回答

0

找到了解决办法哈哈哈花了一段时间来实现这个了......我只是改变了这三个函数的原因...

void rotatex(float xangle) 
{ 
    glPushMatrix(); 
    TranslateMatrix(object,initalpos,-arbitrary[0],-arbitrary[1],-arbitrary[2]); 
    RotateX(object, xangle); 
    TranslateMatrix(object,initalpos,arbitrary[0], arbitrary[1], arbitrary[2]); 
    glPopMatrix(); 
    return; 
} 
void rotatey(float yangle) 
{ 
    glPushMatrix(); 
    TranslateMatrix(object,initalpos,-arbitrary[0],-arbitrary[1],-arbitrary[2]); 
    RotateY(object, yangle); 
    TranslateMatrix(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]); 
    glPopMatrix(); 
    return; 
} 
void rotatez(float zangle) 
{ 
    glPushMatrix(); 
    TranslateMatrix(object,initalpos,-arbitrary[0],-arbitrary[1],-arbitrary[2]); 
    RotateZ(object, zangle); 
    TranslateMatrix(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]); 
    glPopMatrix(); 
    return; 
}