2010-08-29 3 views
0

* Je dis tourner un objet sur son propre axe mais je pense que mon terme est faux ... ce que je veux dire par là, c'est comme faire tourner mon objet des objets centre et pas à l'origineGLUT Multiplication de la matrice pour faire tourner un objet dans son propre axe sans utiliser glRotate

J'essaye de faire un programme qui tourne mon objet (fait en utilisant une matrice de points/sommets) dans son * propre axe sans l'utilisation de glRotate ou glTranslate Ce que j'ai fait était pour faire une fonction MatrixMultiplication et 3 fonctions séparées qui font tourner l'objet dans les axes X, Y et Z et une autre fonction qui les traduit en utilisant des matrices et la fonction de multiplication de matrice:

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; 
} 
} 

} 

et 3 autres fonctions qui représentent les matrices de rotation x y et z ainsi qu'une matrice de traduction. Le programme demande des coordonnées x, y, z pour traduire l'objet là puis vous pouvez utiliser les touches du clavier z, x, c pour le faire pivoter dans les axes x, y, z respectivement et il ferait pivoter l'objet sur son propre axe *

ce que je fais est un appel d'une fonction qui dessine l'objet dans RenderScene et j'utiliser la fonction glutKeyboard pour faire tourner mon objet dans les x, y, z axes ...

jusqu'à présent, mon programme ne ferait que tourner mon objet correctement dans l'origine. Si j'essaie de traduire l'objet ailleurs, il finit par "ajouter" à la traduction chaque fois que j'appuie sur z, x, ou c ... Je comprends que je dois d'abord traduire l'objet à l'origine puis le traduire Je l'ai dit finit par traduire de plus en plus

Quoi qu'il en soit voici les codes que j'ai utilisés pour le faire fonctionner jusqu'à présent ...

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; 

     } 
    } 
} 

Toutes les idées?

+0

Pouvez-vous ajouter le code de la fonction TranslateVector? Lorsque la traduction augmente, il semble que ce soit un mauvais signe (traduisez à l'origine et traduisez ensuite par le signe inversé). – dyp

+0

J'ai trouvé la solution ... en fait je ne peux pas la traduire à l'origine ... J'ai été capable de le corriger en le traduisant à - de leurs positions puis en les traduisant en retour: D – PhoenixNoob121

Répondre

0

trouvé la solution hahaha m'a pris un certain temps pour réaliser la raison était ce ... Je viens de changer ces 3 fonctions ...

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; 
} 
Questions connexes