如果您使用glRotatef
從OpenGL不要忘記,旋轉角度是度數不是弧度!!!
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;
}
欲瞭解更多信息,請參閱:
只是爲了澄清, 'glRotatef()'以度爲單位,而不是弧度。 – user1118321