glRotate 和我的矩阵::rotate

Posted

技术标签:

【中文标题】glRotate 和我的矩阵::rotate【英文标题】:glRotate and my matrix::rotate 【发布时间】:2013-12-13 19:35:29 【问题描述】:

我想获得鼠标外观效果。

省略鼠标坐标获取和其他事情,问题的要点是:

使用固定的opengl函数,可以这样做

glRotate(angley,0,1,0);
glRotate(anglex,1,0,0);

使用我的矩阵类,结果和上面不一样:

mat4 cammtx;
cammtx.rotate(angley,0,1,0);
cammtx.rotate(anglex,1,0,0);

因为相机没有仍然保持y轴,也就是说,z轴似乎也在旋转......

如何使用我的 matrix::rotate 实现实现相同的 glRotate 行为?

struct mat4

    float m[16];

    mat4()identity();
    .
    .
    void rotate(float angle,float x,float y,float z)float res[16];matrix::rotate(res,m,a,x,y,z);memcpy(m,res,sizeof(float)*16);

;

这是我的旋转函数(输入向量未标准化,我知道,但我只传递单位向量)

void rotate(float* mr,float* m,float angle,float x,float y,float z)

    float a=angle*PI_OVER_180;
    float m2[16] = 0;

    float c=cos(a);
    float s=sin(a);

    float xx=x*x,
          yy=y*y,
          zz=z*z;


    m2[0] = xx+(1.0f-xx)*c;
    m2[4] = (1.0f-c)*x*y-s*z;
    m2[8] = (1.0f-c)*x*z+s*y;
    m2[3] = 0.0f;

    m2[1] = (1.0f-c)*y*x+s*z;
    m2[5] = yy+(1.0f-yy)*c;
    m2[9] = (1.0f-c)*y*z-s*x;
    m2[7] = 0.0f;

    m2[2] = (1.0f-c)*z*x-s*y;
    m2[6] = (1.0f-c)*z*y+s*x;
    m2[10] = zz+(1.0f-zz)*c;
    m2[11] = 0.0f;

    m2[12] = 0;
    m2[13] = 0;
    m2[14] = 0;
    m2[15] = 1.0f;

    multiply(mr,m2,m);

这就是乘法函数

float* multiply(float* c,float* aa,float* bb)

    for(int i = 0; i < 4; i++)
    
        c[i*4] = bb[i*4] * aa[0] + bb[i*4+1] * aa[4] + bb[i*4+2] * aa[8] + bb[i*4+3] * aa[12];
        c[i*4+1] = bb[i*4] * aa[1] + bb[i*4+1] * aa[5] + bb[i*4+2] * aa[9] + bb[i*4+3] * aa[13];
        c[i*4+2] = bb[i*4] * aa[2] + bb[i*4+1] * aa[6] + bb[i*4+2] * aa[10] + bb[i*4+3] * aa[14];
        c[i*4+3] = bb[i*4] * aa[3] + bb[i*4+1] * aa[7] + bb[i*4+2] * aa[11] + bb[i*4+3] * aa[15];
    
    return c;

【问题讨论】:

您发布的功能有问题。它们没有类名限定,并且它们使用指向浮点数组的指针而不是使用您的矩阵类。您的mat4 示例代码和您列出的功能真的相关吗?我特别想知道起始矩阵 (*m) 是单位矩阵还是未初始化,但鉴于您列出的代码,这是不可能的。也许最重要的是:您通常后乘列主矩阵,所以multiply(mr,m,m2); 似乎更合适。 对不起安东,我已经编辑了我的帖子,希望你觉得它更容易理解。 啊,这更有意义。但是如果matrix::rotate(res,m,a,x,z); 应该与void rotate(float* mr,float* m,float angle,float x,float y,float z) 匹配,它仍然缺少一个参数。 @Andon 是的,你真的是一个数学怪物......回答我的问题,我会给你一个应得的分数(前提是你不需要我) @Andon 对不起,是 matrix::rotate(res,m,a,x,y,z);我会编辑;发布你的答案!! 【参考方案1】:

使用multiply (...) 的编写方式,您当前正在预乘m2m。因为 OpenGL 使用(更重要的是,因为 您的旋转代码 正在生成)列主矩阵,为了以您需要发布的正确顺序执行一系列矩阵乘法- 将操作数相乘。

这可以通过将 rotate (...) 函数的结尾更改为读取来完成:

multiply(mr,m,m2); // Result = Matrix * Rot

请记住,您需要为自己决定实现的所有矩阵运算执行此操作。平移、缩放等。假设您坚持使用列主要符号,则需要进行后乘。

【讨论】:

这帮助我意识到为什么我的旋转矩阵在缩放,我在 OpenGL 中使用行主矩阵!

以上是关于glRotate 和我的矩阵::rotate的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL glTranslate 和 glRotate

OpenGL 矩阵变换

30.Rotate Image(矩阵旋转)

LeetCode矩阵旋转Rotate Image

从二维变换矩阵中提取旋转、缩放值

SPSS做因子分析的时候那个旋转矩阵(Rotated Matrix)怎么看啊?矩阵里面都代表啥意思啊?