2013-08-04 59 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有关如何工作的详细信息。