[Opengl]OpenGL图形编程项目实战1-4章代码

本文档详细介绍了使用OpenGL进行图形编程的实践项目,涵盖计算机图形学基础,图形变换,二维和三维图形建模,以及真实感图形技术。在macOS环境下,通过GLUT库实现了一系列示例,包括正方体、茶壶、三角形变换、奥运五环、贝塞尔曲线、彩色正方体、光照壶和材质球。项目代码参考了清华大学出版社的《OpenGL图形编程项目实战》并进行了适配和优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行环境:
系统: m a c O S   B i g   S u r   11.0.1 macOS\ Big\ Sur \ 11.0.1 macOS Big Sur 11.0.1
IDE: X c o d e   V e r s i o n   12.2   ( 12 B 45 b ) Xcode\ Version\ 12.2\ (12B45b) Xcode Version 12.2 (12B45b)
采用的OpenGL第三方库: G L U T GLUT GLUT


第一章 计算机图形学概论

调用OpenGL提供的茶壶、圆柱、圆锥等基本几何体的接口函数,通过直接调用接口函数简化程序,从而达到测试链接的目的。

#ifdef __APPLE__
/* Defined before OpenGL and GLUT includes to avoid deprecation messages */
#define GL_SILENCE_DEPRECATION
#include <OpenGL/gl.h>
#include <GLUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glaux.h>
#endif

using namespace std;

void init(){
   
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glColor3f(1.0, 0.0, 0.0);
}

void display(){
   

  glClear(GL_COLOR_BUFFER_BIT);  //清楚屏幕所有内容

//  glutWireTeapot(0.8);

//  glutSolidCube(1);

  gluLookAt(1.0,1.0,0.5,0.5,0.0,0.0,0.0,1.0,0.0); //  //确定了一个可用于为摄像机定位和定向的矩阵,涉及的参数包括摄像机的位置(视点eye),被观察点(点at)以及所期望的up方向。

  glutWireCube(1);

//  gluSphere(<#GLUquadric *quad#>, <#GLdouble radius#>, <#GLint slices#>, <#GLint stacks#>);

//  gluCylinder(<#GLUquadric *quad#>, <#GLdouble base#>, <#GLdouble top#>, <#GLdouble height#>, <#GLint slices#>, <#GLint stacks#>);

   

  glFlush();

}



void myReshape(GLsizei w, GLsizei h){
     //重置窗口大小

  glViewport(0, 0, w, h);

  glMatrixMode(GL_PROJECTION);  //选择投影矩阵

  glLoadIdentity();  //重置投影矩阵

  if (w <= h) {
   
    //需要根据画的对象的大小不同比例来修改参数,为了将实际坐标转化成-1到1之间的值。glOrtho(-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w, 1.50*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
  }
  else
  {
   glOrtho(-1.5*(GLfloat)h/(GLfloat)w, 1.50*(GLfloat)h/(GLfloat)w, -1.5, 1.5, -10.0, 10.0);
  }
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}



int main(int argc, char ** argv)
{
   
  glutInit(&argc, argv);

  // single是单焕存
  glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

  glutInitWindowSize(500, 500);

  glutInitWindowPosition(0, 0);

  glutCreateWindow("zhongguo");

  init();

  glutReshapeFunc(myReshape);

  glutDisplayFunc(display);

  glutMainLoop();

  return 0;
}

运行结果:

正方体:

在这里插入图片描述

茶壶:

在这里插入图片描述


第二章 图形变换

采用OpenGL变换技术实现了从三维空间到二维计算机屏幕图形的转换。

三角形变换

// 没有写出的函数 则和第一章对应的函数相同
void myinit (void)
{
   
    glShadeModel (GL_FLAT);
}

void drawTriangle(){
   
//    glBegin(GL_TRIANGLES);    //实心填充
    glBegin(GL_LINE_LOOP);  //只画线
    glVertex2f(0.0, 1.0);   //范围在-1到1,线条画了,但在屏幕外面
    glVertex2f(1.0, -1.0);
    glVertex2f(-1.0, -1.0);
    glEnd();
}

void CALLBACK display(){
   
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    
    glLoadIdentity();
    glColor3f(1.0, 0.0, 0.0);
    drawTriangle();
    
    glLoadIdentity();
    glTranslatef(-0.5, 0.0, 0.0);
    glColor3f(0.0, 1.0, 0.0);
    drawTriangle();
    
    glLoadIdentity();
    glScalef(1.5, 0.5, 1.0);
    glColor3f(0.0, 0.0, 1.0);
    drawTriangle();
    
    glLoadIdentity();
    glRotatef(90.0, 0.0, 0.0, 1.0);
    glColor3f(1.0, 0.0, 1.0);
    drawTriangle();
    
    glLoadIdentity();
    glScalef(1.0, -0.5, 1.0);
    glColor3f(1.0, 1.0, 0.0);
    drawTriangle();
    glFlush();
}

第三章 图形建模

绘制二维几何体

// 没有写出的函数 则和第一章对应的函数相同
// 如果没有显示图形可能是坐标没有归一化到-1和1范围内,可以调整reshape函数的参数。
void CALLBACK display(){
   
    glColor3f(1.0, 1.0, 0.0);
    draw_my_obj();
    glFlush();
}

void CALLBACK draw_my_obj(){
   
    //    画点
    glBegin(GL_POINTS);
    glColor3f(1.0,1.0,1.0);
    glVertex2f(-1.0,15.0);
    glColor3f(1.0,1.0,0.0);
    glVertex2f(1.0,15.0);
    glColor3f(0.0,1.0,1.0);
    glVertex2f(3.0,15.0);
    glEnd();
    
    //   画不闭合折线
    glBegin(GL_LINE_STRIP);
    glColor3f(1.0,0.0,0.0);
    glVertex2f(-3.0,9.0);
    glVertex2f(2.0,6.0);
    glVertex2f(3.0,9.0);
    glVertex2f(-2,6.0);
    glVertex2f(-3.0,9.0);
    glEnd();
    
    //    画闭合折线
    glBegin(GL_LINE_LOOP);
    glColor3f(0.0,0.0,1.0);
    glVertex2f(7.0,7.0);
    glVertex2f(9.0,9.0);
    glVertex2f(10.0,8.0);
    glVertex2f(11.0,9.0);
    glVertex2f(13.0,7.0);
    glVertex2f(11.0,5.0);
    glVertex2f(10.0,6.0);
    glVertex2f(9.0,5.0);
    glEnd();
    
    //    画填充多边形
    glBegin(GL_POLYGON);
    glColor3f(1.0,1.0,0.2);
    glVertex2f(-10.0,4.0);
    glVertex2f(-8.0,4.0);
    glVertex2f(-6.0,1.0);
    glVertex2f(-8.0,-2.0);
    glVertex2f(-10.0,-2.0);
    glVertex2f(-12.0,1.0);
    glEnd();
    
    //    画线型连续填充三角形串
    glBegin(GL_TRIANGLE_STRIP);
    glVertex2f<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值