在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 :(得分:1)
如果您使用 OpenGL 中的glRotatef
,请不要忘记旋转角度是以度为单位而不是以弧度为单位!!!
对于转换和混淆部分user1118321是绝对正确的。
出于您的目的,我只需要申请GL_MODELVIEW_MATRIX
如果您需要模型空间中的坐标,则必须将逆模型视图矩阵乘以全局坐标向量。
如果您需要全局空间中的坐标,则必须将模型视图矩阵乘以模型坐标向量。
顶点发送的坐标位于模型空间中
你可以用gl函数glGetFlotav/glGetDoublev
double m[16];
glGetDoublev(GL_MODELVIEW_MATRIX,m);
逆矩阵和矩阵x向量乘法在 OpenGL 中不存在,因此您必须自己编写代码或使用某些lib。不要忘记 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;
}
有关详细信息,请参阅:
答案 1 :(得分:0)
你的问题有点令人困惑,因为我不明白这个停止标准你的意思。但是如果你想获得点的变换值,那么你可以简单地将它们传递给适当的变换矩阵,以使它们进入你想要的空间。如果您想要眼睛空间中的值,则通过模型视图矩阵传递顶点坐标。 See here了解其运作方式的详细信息。