基于矩阵在openGL中显示

Posted

技术标签:

【中文标题】基于矩阵在openGL中显示【英文标题】:Displaying in openGL based on a matrix 【发布时间】:2019-11-13 09:15:46 【问题描述】:

我正在尝试在 openGL 窗口中绘制一些形状。我根据特定矩阵中的值绘制这些形状。我正在使用 glut,它有一个带有 1 个参数的函数 glutDisplayFunc,一个不带参数并返回 void 的函数回调。但是我需要根据无法传递给函数回调的矩阵在窗口上绘制图像。

这是一个示例代码

#include<stdio.h>
#include<GL/glut.h>
#include<math.h>
#define pi 3.142857
void mat()

        int a[2][2];
    //
    for(int i=0;i<2;i++)
        for (int j = 0; j < 2; ++j)
        
            scanf("%d",&a[i][j]);
        

// function to initialize
void myInit (void)

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glColor3f(0.0, 1.0, 0.0);
    glPointSize(1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-780, 780, -420, 420);


void display (void)

    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POINTS);
    float x, y, i;
    for ( i = 0; i < (2 * pi); i += 0.001)
    
        x = 200 * cos(i);
        y = 200 * sin(i);

        glVertex2i(x, y);
    
    glEnd();
    glFlush();


int main (int argc, char** argv)

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

    // giving window size in X- and Y- direction
    glutInitWindowSize(1366, 768);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Circle Drawing");
    myInit();
    glutDisplayFunc(display);
    glutMainLoop();


我需要能够使用函数 mat 中的矩阵 a 来定义 2 个圆的中心。如何从 mat 函数中绘制窗口? 编辑:包含代码并修正了一些错别字

【问题讨论】:

欢迎来到 SO - 请发布您的代码 更多的是c的问题,如何将变量传递给不接受任何参数的函数。在这种过剩的情况下,我没有看到其他更清洁的可能性,而不是将您的输入矩阵定义为全局变量static int a[2][2](我坚持根据您的代码输入int,但我相信您的意思是float和它对于GL_MODELVIEW 矩阵,可能是 3x3 或 4x4 矩阵)。在渲染之前,您通常可以接受a 矩阵的输入,然后在display() 中,您通常只需引用变量a 【参考方案1】:
void display(void)

    glClear(GL_COLOR_BUFFER_BIT);

    //-----------
    float a[4][4] = 
        1,0,0,0,
        0,1,0,0,
        0,0,1,0,
        0,0,0,1 ;

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glLoadMatrixf((float*)a);
    //----------

    glBegin(GL_POINTS);
    float x, y, i;
    for (i = 0; i < (2 * pi); i += 0.001)
    
        x = 200 * cos(i);
        y = 200 * sin(i);

        glVertex2i(x, y);
    
    glEnd();
    glFlush();

【讨论】:

【参考方案2】:

一般可以通过设置GL_MODELVIEW矩阵模式(glMatrixMode)加载当前模型视图矩阵,通过glLoadMatrixf加载矩阵。 可选地,矩阵可以乘以 glMultMatrix 到当前矩阵。

但在这两种情况下,矩阵都必须是 4x4 Transformation matrix。这两个函数的参数是一个指向 16 个数组的指针 floats 分别是一个二维 4x4 float-array。 初始化一个 4x4 Identity matrix 并读取左上角的 2x2,以建立一个围绕 z 轴的旋转矩阵:

此外,我建议读取以度为单位的旋转角度,并通过三角函数 sincos 分别计算旋转轴。 最后阅读xy翻译组件:

#define _USE_MATH_DEFINES
#include <math.h>
float a[4][4];

void mat()

    // init identity matrix
    for(int i = 0; i < 4; i++)
        for (int j = 0; j < 4; ++j)
            a[i][j] = (i==j) ? 1.0f : 0.0f; 

    // read the angle in degrees
    float angle_degree;
    scanf("%f", &angle_degree);

    // convert the angle to radian
    float angle_radiant = angle_degree * (float)M_PI / 180.0f;

    // set rotation around z-axis
    float cos_ang = cos(angle_radiant); 
    float sin_ang = sin(angle_radiant); 
    a[0][0] = cos_ang; 
    a[0][1] = -sin_ang;
    a[1][0] = sin_ang;
    a[1][1] = cos_ang;  

    // read translation
    scanf("%f", &a[3][0]);
    scanf("%f", &a[3][1]);

void display (void)

    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixf(&a[0][0]);

    // [...]

【讨论】:

以上是关于基于矩阵在openGL中显示的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 矩阵逻辑错误

[OpenGL](翻译+补充)投影矩阵的推导

[OpenGL](翻译+补充)投影矩阵的推导

openGL - 正交投影矩阵

Opengl相机和乘法矩阵

现代 OpenGL:VBO、GLM 和矩阵堆栈