基于矩阵在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 个数组的指针 float
s 分别是一个二维 4x4 float
-array。
初始化一个 4x4 Identity matrix 并读取左上角的 2x2,以建立一个围绕 z 轴的旋转矩阵:
此外,我建议读取以度为单位的旋转角度,并通过三角函数 sin
和 cos
分别计算旋转轴。
最后阅读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中显示的主要内容,如果未能解决你的问题,请参考以下文章