C++ 具有非均匀缩放的3x3矩阵旋转

C++ 具有非均匀缩放的3x3矩阵旋转,c++,math,opengl,matrix,rotational-matrices,C++,Math,Opengl,Matrix,Rotational Matrices,我在处理矩阵变换时遇到了一些问题。对于测试,我有一个由10个正方形组成的链,每个正方形都是前一个正方形的子对象。然后我可以对每个正方形进行旋转,得到这个结果 这是正确的,正是我想要的。现在,第八个正方形的比例也是一样的 同样,这是完美的。孩子们正在继承他们的父母。现在问题来了,当我对第八个正方形应用非均匀比例时 这张图片是一个微妙的例子,但我希望你们能理解。最后一个方块不接触上一个方块的角。它也可能不明显,但最后两个正方形实际上不是正确的尺寸。如果我应用更多的旋转,这将变得更加明显

我在处理矩阵变换时遇到了一些问题。对于测试,我有一个由10个正方形组成的链,每个正方形都是前一个正方形的子对象。然后我可以对每个正方形进行旋转,得到这个结果



这是正确的,正是我想要的。现在,第八个正方形的比例也是一样的



同样,这是完美的。孩子们正在继承他们的父母。现在问题来了,当我对第八个正方形应用非均匀比例时



这张图片是一个微妙的例子,但我希望你们能理解。最后一个方块不接触上一个方块的角。它也可能不明显,但最后两个正方形实际上不是正确的尺寸。如果我应用更多的旋转,这将变得更加明显

这是我构造矩阵的代码

maths::mat3 DisplayObject::getGlobalTransform() {

    maths::mat3 output(1.0f);
    output *= maths::mat3::Rotate(rotation);
    output *= maths::mat3::Scale(scale);
    output *= maths::mat3::Translate(position);

    if(parent != nullptr){
        output *= parent->getGlobalTransform();
    }

    return output;

}
任何帮助或想法都将不胜感激

编辑:以下是我如何应用旋转和缩放

mat3 mat3::Rotate(float angle)
{
    mat3 result(1.0f);

    float r = toRadians(angle);
    result.elements[0] = cos(r);
    result.elements[1] = -sin(r);
    result.elements[3] = sin(r);
    result.elements[4] = cos(r);

    return result;
}

mat3 mat3::Scale(const vec2& scale)
{
    mat3 result(1.0f);
    result.elements[0] = scale.x;
    result.elements[4] = scale.y;
    return result;
}
。。。这是我如何再次把他们弄出来的

float mat3::GetRotation() const
{
    return atan2(elements[1], elements[0]);
}

vec2 mat3::GetScale() const
{   
    return vec2(rows[0].Magnitude(), rows[1].Magnitude());
}
我试过这个:

#include<GL/glut.h>
#include<math.h>
#define PI 3.14159265
#define M 50.0f

void display() {
    glClear(GL_COLOR_BUFFER_BIT);

    for (int i = 0; i < M; i++)
    {
        glTranslatef(1, 1, 0);
        glRotatef(25.0f, 0, 0, 1);
        glScalef(1.2, 1, 0);

        glColor3f(1.0f-i/M, i/M, 0.0f);

        glBegin(GL_QUADS);
        glVertex2f(0.0, 0.0);
        glVertex2f(0.0, 1.0);
        glVertex2f(1.0, 1.0);
        glVertex2f(1.0, 0.0);
        glEnd();
    }

    glFlush();
}

void myinit() {
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 250.0, 0.0, 250.0);
    glTranslatef(125, 125, 0);
}

void main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(501, 501);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("59531834");
    glutDisplayFunc(display);

    myinit();
    glutMainLoop();
}

@拉比不太清楚,我只是想确定一下。谢谢。@Rabbid76然后我得到了一个类似但同样错误的结果哈哈。然而,它并没有破坏统一的缩放版本,这是一个耻辱,因为现在我不知道哪个顺序是正确的!你的目标结果是什么?“只有一个矩形还是多个矩形?@rabbi76谢谢你,奇怪的是它两种方式都是一样的。”。但你是对的,我已经更新了那一行。(我将编辑文章以匹配)。但是,非均匀比例问题仍然存在。@Orace目标结果,所有正方形的角都应该接触,并继承其父级比例。适用于均匀缩放。非常感谢您为我运行此功能。这证实了这是我的矩阵数学代码的问题,而不是上面的问题。在您的示例中,只需将
parent->getGlobalTransform()
的结果复制到
output
,而不是进行相对昂贵的矩阵乘法,这将更有意义。
maths::mat3 DisplayObject::getGlobalTransform() {

    maths::mat3 output(1.0f);

    if(parent != nullptr){
        output *= parent->getGlobalTransform();
    }

    output *= maths::mat3::Translate(position);
    output *= maths::mat3::Scale(scale);
    output *= maths::mat3::Rotate(rotation);

    return output;
}