运行环境:
系统: 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<