如何在OpenGL中执行矩形剪切

how to perform shearing of a rectangle in OpenGL

本文关键字:执行 OpenGL      更新时间:2023-10-16

我正在使用OpenGL API,使用SSR(缩放/剪切/旋转)方法获得矩形的等轴测视图。我能够缩放和旋转矩形。但是我不知道如何剪切一个矩形。我是OpenGL的新手。请帮忙。

#include <glglut.h>  // glut.h must come before gl.h and glu.h
#include <glgl.h>
#include <glglu.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_QUADS);
    glVertex2f(20, 20);
    glVertex2f(20, 70);
    glVertex2f(70, 70);
    glVertex2f(70, 20);
    glEnd();
    glScalef(0.86,0.86,0.86);
    glTranslatef(200,0,0);
    glRotatef(30, 0, 0,1);
    glBegin(GL_QUADS);
    glVertex2f(20, 20);
    glVertex2f(20, 70);
    glVertex2f(70, 70);
    glVertex2f(70, 20);
    glEnd();
    glFlush();
}

void init()
{
    glClearColor(0.5,0.5,0.0, 0.0);
    glColor3f(1,0,0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,      // left
        800,  // right
        800, // bottom
        0,      // top
        0,      // zNear
        1       // zFar
        );
}

void main(int argc, char** argv) 
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowSize(900, 1080);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Simple");
    glutDisplayFunc(display);
    init();
    glutMainLoop();
}

对于平行于x轴的剪切量shear:

GLfloat m[16] = {
    1.0f, 0.0f, 0.0f, 0.0f,
    shear, 1.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 0.0f, 1.0f
};
glMultMatrixf(m);

平行于y轴:

GLfloat m[16] = {
    1.0f, shear, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 0.0f, 1.0f
};
glMultMatrixf(m);

当您将其与数学符号中指定的矩阵(例如维基百科剪切矩阵页面)进行比较时,请记住OpenGL矩阵是按列主顺序指定的。

以上两项都适用于2D平面中的变换。即,第一个保持x轴静止,剪切y轴,而第二个保持y轴静止,并剪切x轴。如果你在整个三维空间中观察剪切变换,你会得到更多的变化。