2013-08-04 85 views
2

在OpenGL項目,我有旋轉模型的函數:C++的OpenGL旋轉和計算

glRotatef(M_PI/4, 0, 0, 1); //旋轉。通過PI/4弧度,即45度

現在,當我繪製點(0, 1)與尊重輪換。我將在這個點上(1/sqrt(2),1/sqrt(2)),這只是單位圓幾何。然而,這些點將以可變座標x1, x2, y1, y2繪製。另外,我想在我的近似值足夠接近之後停止繪圖。

問題是我的停止標準仍然是在全局座標方面而不是在旋轉方面。例如,考慮方程尊重變換的y2 = y1。因此,在全局座標系中,這隻會是y2 = y1 * sin(pi/4),所以y2將會在y1的右側更低。然而,y2的值只是設置爲y1,這會在我的停止標準y2-y1中產生一個問題,然後這個標準就會變成零。

如何從OpenGL獲取y2的旋轉值?

+0

只是爲了澄清, 'glRotatef()'以度爲單位,而不是弧度。 – user1118321

回答

1

如果您使用glRotatefOpenGL不要忘記,旋轉角度是度數不是弧度!!!

for the transformation and confusion part user1118321是絕對正確的。

我的事情你的目的,你只需要,如果你需要在模型空間座標,您必須通過全局座標矢量乘以逆模型視圖矩陣應用GL_MODELVIEW_MATRIX

如果您需要全局空間中的座標,則必須將模型視圖矩陣乘以模型座標矢量。

座標由頂點發是在模型空間 可以獲取實際的模型視圖矩陣與GL功能glGetFlotav/glGetDoublev

double m[16]; 
glGetDoublev(GL_MODELVIEW_MATRIX,m); 

逆矩陣和矩陣X矢量乘法不存在的OpenGL,所以你必須自己編寫它或者使用一些庫。不要忘記,矩陣OpenGL是列導向不面向行和座標向量均勻所以x,y,z,w其中w=1爲您的目的。下面是代碼,我用我的的OpenGL分計算,所有矢量均爲double[4]和矩陣是double[16]

void matrix_mul_vector(double *c,double *a,double *b) 
     { 
     double q[3]; 
     q[0]=(a[ 0]*b[0])+(a[ 4]*b[1])+(a[ 8]*b[2])+(a[12]); 
     q[1]=(a[ 1]*b[0])+(a[ 5]*b[1])+(a[ 9]*b[2])+(a[13]); 
     q[2]=(a[ 2]*b[0])+(a[ 6]*b[1])+(a[10]*b[2])+(a[14]); 
     for(int i=0;i<3;i++) c[i]=q[i]; 
     } 
void matrix_subdet (double *c,double *a) 
     { 
     double q[16]; 
     int  i,j; 
     for (i=0;i<4;i++) 
     for (j=0;j<4;j++) 
      q[j+(i<<2)]=matrix_subdet(a,i,j); 
     for (i=0;i<16;i++) c[i]=q[i]; 
     } 
double matrix_subdet (  double *a,int r,int s) 
     { 
     double c,q[9]; 
     int  i,j,k; 
     k=0;       // q = sub matrix 
     for (j=0;j<4;j++) 
     if (j!=s) 
      for (i=0;i<4;i++) 
      if (i!=r) 
       { 
       q[k]=a[i+(j<<2)]; 
       k++; 
       } 
     c=0; 
     c+=q[0]*q[4]*q[8]; 
     c+=q[1]*q[5]*q[6]; 
     c+=q[2]*q[3]*q[7]; 
     c-=q[0]*q[5]*q[7]; 
     c-=q[1]*q[3]*q[8]; 
     c-=q[2]*q[4]*q[6]; 
     if (int((r+s)&1)) c=-c;  // add signum 
     return c; 
     } 
double matrix_det  (  double *a) 
     { 
     double c=0; 
     c+=a[ 0]*matrix_subdet(a,0,0); 
     c+=a[ 4]*matrix_subdet(a,0,1); 
     c+=a[ 8]*matrix_subdet(a,0,2); 
     c+=a[12]*matrix_subdet(a,0,3); 
     return c; 
     } 
double matrix_det  (  double *a,double *b) 
     { 
     double c=0; 
     c+=a[ 0]*b[ 0]; 
     c+=a[ 4]*b[ 1]; 
     c+=a[ 8]*b[ 2]; 
     c+=a[12]*b[ 3]; 
     return c; 
     } 
void matrix_inv  (double *c,double *a) 
     { 
     double d[16],D; 
     matrix_subdet(d,a); 
     D=matrix_det(a,d); 
     if (D) D=1.0/D; 
     for (int i=0;i<16;i++) c[i]=d[i]*D; 
     } 

欲瞭解更多信息,請參閱:

0

你的問題有點令人困惑,因爲我不明白你這個停止標準是什麼意思。但是如果你想獲得點的變換值,那麼你可以簡單地通過適當的變換矩陣來讓它們進入你想要的空間。例如,如果您需要眼圖空間中的值,請將頂點座標傳遞到模型視圖矩陣。 See here有關如何工作的詳細信息。