ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c OpenGL旋转和计算

2019-09-26 15:05:02  阅读:190  来源: 互联网

标签:c opengl rotation


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

解决方法:

如果你使用OpenGL的glRotatef,不要忘记旋转角度是以度为单位而不是弧度!

对于转换和混淆部分user1118321是绝对正确的.

我出于您的目的,您只需要申请GL_MODELVIEW_MATRIX

如果您需要模型空间中的坐标,则必须将逆模型视图矩阵乘以全局坐标向量.

如果您需要全局空间中的坐标,则必须将模型视图矩阵乘以模型坐标向量.

顶点发送的坐标在模型空间中
你可以用gl函数glGetFlotav / glGetDoublev获得实际的modelview矩阵

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

OpenGL中不存在逆矩阵和矩阵x向量乘法,因此您必须自己编写代码或使用某些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;
        }

有关详情,请参阅:

> Understanding 4×4 homogenous transform matrices

标签:c,opengl,rotation
来源: https://codeday.me/bug/20190926/1820478.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有