2013-12-13 76 views
0

我想獲得mouselook效果。glRotate和我的矩陣::旋轉

省略鼠標COORDS收購和其他的東西,問題的要點是:使用固定的OpenGL函數

,這可以由使用我的矩陣類做

glRotate(angley,0,1,0); 
glRotate(anglex,1,0,0); 

,結果不如上:

mat4 cammtx; 
cammtx.rotate(angley,0,1,0); 
cammtx.rotate(anglex,1,0,0); 

因爲相機不能還抱着y軸,也就是還Z軸似乎旋轉...

我如何用我的矩陣::旋轉實現實現相同的glRotate行爲?

struct mat4 
{ 
    float m[16]; 

    mat4(){identity();} 
    . 
    . 
    void rotate(float angle,float x,float y,float z){float res[16];matrix::rotate(res,m,a,x,y,z);memcpy(m,res,sizeof(float)*16);} 

}; 

這裏是我的旋轉功能(輸入向量不歸,我知道,但我只傳遞單位向量)

void rotate(float* mr,float* m,float angle,float x,float y,float z) 
{ 
    float a=angle*PI_OVER_180; 
    float m2[16] = {0}; 

    float c=cos(a); 
    float s=sin(a); 

    float xx=x*x, 
      yy=y*y, 
      zz=z*z; 


    m2[0] = xx+(1.0f-xx)*c; 
    m2[4] = (1.0f-c)*x*y-s*z; 
    m2[8] = (1.0f-c)*x*z+s*y; 
    m2[3] = 0.0f; 

    m2[1] = (1.0f-c)*y*x+s*z; 
    m2[5] = yy+(1.0f-yy)*c; 
    m2[9] = (1.0f-c)*y*z-s*x; 
    m2[7] = 0.0f; 

    m2[2] = (1.0f-c)*z*x-s*y; 
    m2[6] = (1.0f-c)*z*y+s*x; 
    m2[10] = zz+(1.0f-zz)*c; 
    m2[11] = 0.0f; 

    m2[12] = 0; 
    m2[13] = 0; 
    m2[14] = 0; 
    m2[15] = 1.0f; 

    multiply(mr,m2,m); 
} 

這是乘法功能

float* multiply(float* c,float* aa,float* bb) 
{ 
    for(int i = 0; i < 4; i++) 
    { 
     c[i*4] = bb[i*4] * aa[0] + bb[i*4+1] * aa[4] + bb[i*4+2] * aa[8] + bb[i*4+3] * aa[12]; 
     c[i*4+1] = bb[i*4] * aa[1] + bb[i*4+1] * aa[5] + bb[i*4+2] * aa[9] + bb[i*4+3] * aa[13]; 
     c[i*4+2] = bb[i*4] * aa[2] + bb[i*4+1] * aa[6] + bb[i*4+2] * aa[10] + bb[i*4+3] * aa[14]; 
     c[i*4+3] = bb[i*4] * aa[3] + bb[i*4+1] * aa[7] + bb[i*4+2] * aa[11] + bb[i*4+3] * aa[15]; 
    } 
    return c; 
} 
+0

某些東西與您發佈的功能不符。他們沒有使用類名稱進行限定,他們將指針指向浮點數組,而不是使用矩陣類。你的'mat4'示例代碼和你列出的功能真的有關係嗎?我特別想知道起始矩陣('* m')是否是一個單位矩陣或未初始化的矩陣,但是不可能說明給出的代碼已經列出。也許最重要的是:你一般**後乘**列主矩陣,所以'乘(mr,m,m2);'似乎更合適。 –

+0

對不起Andon,我編輯了我的文章,我希望你發現它更容易理解。 – freesoft

+0

啊,這樣做更有意義。但仍然'矩陣::旋轉(res,m,a,x,z);'如果它應該與'void rotate(float * mr,float * m,float angle,float x, float y,float z)'。 –

回答

2

使用multiply (...)這種寫法,您目前的乘數是m2m。由於OpenGL使用(更重要的是,因爲您的輪換代碼正在生成)列主矩陣,爲了按照正確的順序執行一系列矩陣乘法,您需要對操作數進行後乘。

這可以通過簡單地改變你的rotate (...)函數結束時閱讀來完成:

multiply(mr,m,m2); // Result = Matrix * Rot 

請記住,您需要爲您決定實現自己所有的矩陣運算做到這一點。翻譯,縮放等。假設您堅持使用列專業符號,您需要進行後乘。

+0

這幫助我意識到爲什麼我的旋轉矩陣是縮放的,我在OpenGL中使用了行主矩陣! –