2

在 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 的旋转值?

4

2 回答 2

1

如果您glRotatefOpenGL中使用,请不要忘记旋转角度是度数而不是弧度!!!

对于转换和混淆部分 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;
        }

有关更多信息,请参阅:

于 2013-08-04T09:17:32.857 回答
0

您的问题有点令人困惑,因为我不明白您所说的停止标准是什么意思。但是,如果您想获得点的转换值,那么您只需将它们通过适当的转换矩阵即可将它们放入您想要的空间。例如,如果您想要眼睛空间中的值,则通过模型视图矩阵传递您的顶点坐标。有关其工作原理的详细信息,请参见此处

于 2013-08-04T04:27:41.463 回答