OpenGL---GLUT(二)续

前面一所说的,讲到了创建一个窗体并且绘制了一个三角形,那么接下来接着上一次的继续将下一个函数的功能那就是

glutReshapeFunc()

在oepngl程序运行后,你将看到两个窗口:一个控制台窗口,一个OpenGL窗口。现在改变窗口大小使高度与宽度不再相等,这时三角形发生变形。这会发生是因为你没有正确设置投影矩阵。默认的是透视投影矩阵且高宽比为1.因此高宽比改变了,投影就会变形。因此只要高宽比改变了,投影就应该重新计算。

GLUT定义了当窗口大小改变时哪一个函数应该被调用。此外,这个函数还会在窗口初次被创建时调用,保证初始化窗口不是正方形的时候渲染也不会变形出错。

这个函数是glutReshapeFunc()

8.glutReshapeFunc(void(*func)int width,int height);

参数:

func: 指负责设置正确投影的函数的名称。

因此我们必须做的第一件事是回到main()函数。在上一章的代码里加入对glutReshapeFunc()的调用,让我们把负责窗口尺寸的函数叫做Handle_Reshape。下面我们需要做的就是定义函数changeSize()。从glutReshapeFunc()函数的声明可以看到,changSize()函数有两个形参。。这两个参数代表新的窗口高度和宽度。

void main(int argc, char **argv) {

          glutInit(&argc, argv);

          glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);

          glutInitWindowPosition(100,100);

          glutInitWindowSize(320,320);

          glutCreateWindow("3D Tech- GLUT Tutorial");

          glutDisplayFunc(renderScene);

          // Here is our new entry in the main function 

          glutReshapeFunc(changeSize);

          glutMainLoop();

 }


void changeSize(int w, int h) {
// 防止除数即高度为0

   // (你可以设置窗口宽度为0).

          if(h == 0)

                  h = 1;

          float ratio = 1.0* w / h;

          // 单位化投影矩阵。

          glMatrixMode(GL_PROJECTION);

          glLoadIdentity(); 

          // 设置视口大小为增个窗口大小

          glViewport(0, 0, w, h);

          // 设置正确的投影矩阵

          gluPerspective(45,ratio,1,1000);

         //下面是设置模型视图矩阵

          glMatrixMode(GL_MODELVIEW);

          glLoadIdentity();

          gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0,0.0f,1.0f,0.0f);

 }

第一步是计算高宽比(wight/height)。注意为了计算正确,我们必须保证高度不为0

接着,我们设置当前矩阵为投影矩阵,这个矩阵定义了一个可视空间(viewing volume)。

我们调用一个单位矩阵来初始化投影矩阵。然后我们用函数glViewport把视口设置为整个窗口。你也可以设置不同的值。函数中(00)指定了视口的左下角,(w,h)指定了视口矩形的大小。注意这个坐标是和客户区域有关的,而不是屏幕坐标。。

gluPerspective函数是其他OpenGL库(GLU库)里的一个函数。

最后就是设置模型观测矩阵。调用GL_MODELVIEW把当前矩阵设为模型观测矩阵。

gluLookAt()也是GLU库里的一个函数

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用OpenGL绘制国旗可以通过以下步骤实现: 1. 创建OpenGL上下文和窗口。 2. 设置绘制区域和视口。 3. 设置绘制颜色和深度缓冲区。 4. 绘制国旗的红色背景。 5. 绘制五颗黄色的五角星。可以使用OpenGL的绘制多边形功能来绘制五角星,也可以使用纹理映射来贴上五角星的图案。 6. 交换前后缓冲区,显示绘制结果。 以下是一个简单的OpenGL绘制国旗的示例代码: ``` #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(1.0, 0.0, 0.0); // 设置绘制颜色为红色 glBegin(GL_QUADS); glVertex2f(-1.0, 1.0); glVertex2f(-1.0, -1.0); glVertex2f(1.0, -1.0); glVertex2f(1.0, 1.0); // 绘制国旗的红色背景 glEnd(); glColor3f(1.0, 1.0, 0.0); // 设置绘制颜色为黄色 glBegin(GL_POLYGON); glVertex2f(-0.5, 0.5); glVertex2f(-0.25, 0.25); glVertex2f(0.0, 0.5); glVertex2f(0.25, 0.25); glVertex2f(0.5, 0.5); glVertex2f(0.375, 0.25); glVertex2f(0.5, 0.0); glVertex2f(0.375, -0.25); glVertex2f(0.5, -0.5); glVertex2f(0.25, -0.375); glVertex2f(0.0, -0.5); glVertex2f(-0.25, -0.375); glVertex2f(-0.5, -0.5); glVertex2f(-0.375, -0.25); glVertex2f(-0.5, 0.0); glVertex2f(-0.375, 0.25); // 绘制五角星 glEnd(); glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(800, 600); glutInitWindowPosition(100, 100); glutCreateWindow("OpenGL Flag"); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 该示例代码使用了OpenGL的基本绘图功能,通过绘制红色背景和黄色五角星实现了绘制国旗的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值