终于把桌子都搞定了(虽然还是有点丑?)算是把一开始想做的都做了吧

table.h

//@author Birdy&C 2017.4.7
#pragma once
#define GLUT_DISABLE_ATEXIT_HACK
#include <stdio.h>
#include<windows.h>
#include <gL\GLAUX.H>
#include <gl\GLUT.H>  //函数声明//===========main.cpp============//void init();//===========event.cpp============//
void timer(int p);
void mouse(int button, int state, int x, int y);
void motion(int x, int y);
void special(int key, int x, int y);
void keyboard(unsigned char key, int x, int y);
void setProjection(int width, int height);
void reshape(int w1, int h1);//===========render.cpp============//
AUX_RGBImageRec *LoadBMP(CHAR *Filename);
int LoadGLTextures();
void Draw_Leg();
void Draw_Table();
void drawMain();
void renderScene();
void renderScenesw1();
void renderScenesw2();
void renderScenesw3();
void renderSceneAll();//全局变量extern bool mouseisdown, loopr;
extern int mainWindow, subWindow1, subWindow2, subWindow3, rx, ry, rz, tx, ty, w, h;
extern int time, state;
extern const int border;
extern float  mx, mz;
extern GLuint  texture[1]; 

render.cpp

// render.cpp : 绘制函数
//@author Birdy&C 2017.4.7#include "table.h"AUX_RGBImageRec *LoadBMP(CHAR *Filename)    // 载入位图图象
{FILE *File = NULL;                      // 文件句柄int check;if (!Filename)                          // 确保文件名已提供{return NULL;                        // 如果没提供,返回 NULL}check = fopen_s(&File, Filename, "r");      // 尝试打开文件if (check == 0)                             // 文件存在{fclose(File);                           // 关闭句柄return auxDIBImageLoadA(Filename);      // 载入位图并返回指针}return NULL;                                // 如果载入失败,返回 NULL
}int LoadGLTextures()         // 载入位图(调用上面的代码)并转换成纹理
{int Status = FALSE;                             // 状态指示器AUX_RGBImageRec *TextureImage[1];               // 创建纹理的存储空间memset(TextureImage, 0, sizeof(void *) * 1);    // 将指针设为 NULLTextureImage[0] = LoadBMP("wood.bmp");          // 载入位图,检查有无错误,如果位图没找到则退出if (NULL != TextureImage[0]){Status = TRUE;                              // 将 Status 设为 TRUEprintf("LOAD SUCCESS\n");glGenTextures(1, &texture[0]);              // 创建纹理glBindTexture(GL_TEXTURE_2D, texture[0]);   // 使用来自位图数据生成 的典型纹理// 生成纹理glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 线形滤波glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 线形滤波}if (TextureImage[0])                    // 纹理是否存在{if (TextureImage[0]->data)          // 纹理图像是否存在{free(TextureImage[0]->data);    // 释放纹理图像占用的内存}free(TextureImage[0]);              // 释放图像结构}return Status;                          // 返回 Status
}void Draw_Leg() // This function draws a triangle with RGB colors
{//四面glBegin(GL_QUADS);glTexCoord2f(0.0f, 1.0f);   glVertex3f(-0.5f, 0.5f, 0.0f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.0f);   glVertex3f(-0.5f, 0.5f, 3.0f); // 纹理和四边形的左下glTexCoord2f(1.0f, 0.0f);   glVertex3f(0.5f, 0.5f, 3.0f); // 纹理和四边形的右下glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.5f, 0.5f, 0.0f); // 纹理和四边形的右上glTexCoord2f(1.0f, 1.0f);   glVertex3f(-0.5f, -0.5f, 0.0f); // 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.5f, -0.5f, 0.0f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.5f, -0.5f, 3.0f); // 纹理和四边形的左下glTexCoord2f(1.0f, 0.0f);   glVertex3f(-0.5f, -0.5f, 3.0f); // 纹理和四边形的右下glTexCoord2f(1.0f, 0.0f);   glVertex3f(0.5f, -0.5f, 0.0f); // 纹理和四边形的右下glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.5f, 0.5f, 0.0f); // 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.5f, 0.5f, 3.0f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.5f, -0.5f, 3.0f); // 纹理和四边形的左下glTexCoord2f(0.0f, 0.0f);   glVertex3f(-0.5f, 0.5f, 0.0f); // 纹理和四边形的左下glTexCoord2f(1.0f, 0.0f);   glVertex3f(-0.5f, -0.5f, 0.0f); // 纹理和四边形的右下glTexCoord2f(1.0f, 1.0f);   glVertex3f(-0.5f, -0.5f, 3.0f); // 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f);   glVertex3f(-0.5f, 0.5f, 3.0f); // 纹理和四边形的左上//底边glTexCoord2f(0.4f, 0.0f); glVertex3f(-0.5f, -0.5f, 0); // 纹理和四边形的右下glTexCoord2f(0.4f, 0.4f); glVertex3f(-0.5f, 0.5f, 0); // 纹理和四边形的右上glTexCoord2f(0.0f, 0.4f); glVertex3f(0.5f, 0.5f, 0); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.4f); glVertex3f(0.5f, -0.5f, 0); // 纹理和四边形的左下glEnd();
}void Draw_Table() // This function draws a triangle with RGB colors
{//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);            //空心//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);        //实心glBindTexture(GL_TEXTURE_2D, texture[0]);      // 选择纹理//glColor3f(1.0f, 1.0f, 1.0f);                      //选择颜色//上下glBegin(GL_QUADS);glTexCoord2f(0.0f, 0.0f);   glVertex3f(-2.5f, 2.0f, 4.0f);// 纹理和四边形的左上glTexCoord2f(1.0f, 0.0f);   glVertex3f(2.5f, 2.0f, 4.0f);// 纹理和四边形的右上glTexCoord2f(1.0f, 1.0f);   glVertex3f(2.5f, -2.0f, 4.0f); // 纹理和四边形的右下glTexCoord2f(0.0f, 1.0f);   glVertex3f(-2.5f, -2.0f, 4.0f);// 纹理和四边形的左下glTexCoord2f(1.0f, 0.0f);   glVertex3f(-2.5f, -2.0f, 3.0f); // 纹理和四边形的右下glTexCoord2f(1.0f, 1.0f);   glVertex3f(-2.5f, 2.0f, 3.0f);// 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f);   glVertex3f(2.5f, 2.0f, 3.0f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.0f);   glVertex3f(2.5f, -2.0f, 3.0f); // 纹理和四边形的左下     //四面glTexCoord2f(0.5f, 0.0f);   glVertex3f(2.5f, -2.0f, 4.0f); // 纹理和四边形的左下glTexCoord2f(0.5f, 1.0f);   glVertex3f(2.5f, 2.0f, 3.0f); // 纹理和四边形的右下glTexCoord2f(0.0f, 1.0f);   glVertex3f(2.5f, -2.0f, 3.0f); // 纹理和四边形的右上glTexCoord2f(0.0f, 0.0f);   glVertex3f(2.5f, 2.0f, 4.0f); // 纹理和四边形的左上glTexCoord2f(0.5f, 0.0f);   glVertex3f(-2.5f, 2.0f, 3.0f); // 纹理和四边形的左上glTexCoord2f(1.0f, 0.0f);   glVertex3f(-2.5f, -2.0f, 3.0f);// 纹理和四边形的左下glTexCoord2f(1.0f, 1.0f);   glVertex3f(-2.5f, -2.0f, 4.0f); // 纹理和四边形的右下glTexCoord2f(0.5f, 1.0f);   glVertex3f(-2.5f, 2.0f, 4.0f); // 纹理和四边形的右上glTexCoord2f(0.0f, 1.0f);   glVertex3f(-2.5f, 2.0f, 3.0f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.5f);   glVertex3f(-2.5f, 2.0f, 4.0f); // 纹理和四边形的左下glTexCoord2f(1.0f, 0.5f);   glVertex3f(2.5f, 2.0f, 4.0f); // 纹理和四边形的右下glTexCoord2f(1.0f, 1.0f);   glVertex3f(2.5f, 2.0f, 3.0f); // 纹理和四边形的右上glTexCoord2f(1.0f, 0.5f);   glVertex3f(-2.5f, -2.0f, 3.0f);// 纹理和四边形的右上glTexCoord2f(0.0f, 0.5f);   glVertex3f(2.5f, -2.0f, 3.0f); // 纹理和四边形的左上glTexCoord2f(0.0f, 0.0f);   glVertex3f(2.5f, -2.0f, 4.0f); // 纹理和四边形的左下glTexCoord2f(1.0f, 0.0f);   glVertex3f(-2.5f, -2.0f, 4.0f); // 纹理和四边形的右下glEnd();//画桌子腿glPushMatrix();glTranslatef(1.5f, 1.0f, 0.0f);Draw_Leg();glPopMatrix();glPushMatrix();glTranslatef(1.5f, -1.0f, 0.0f);Draw_Leg();glPopMatrix();glPushMatrix();glTranslatef(-1.5f, 1.0f, 0.0f);Draw_Leg();glPopMatrix();glPushMatrix();glTranslatef(-1.5f, -1.0f, 0.0f);Draw_Leg();glPopMatrix();glFlush();}void drawMain()
{glPushMatrix();if (loopr){switch (state){case 1:mz = 0.1 * time;state = 1;break;case 2:rx = 12 * time;break;case 3:glScalef(1 + 0.01*time, 1 + 0.01*time, 1 + 0.01*time);break;}}glTranslatef(mx, 0.0f, mz);     // 平移//旋转glRotatef(rx, 1, 0, 0); glRotatef(ry, 0, 1, 0);glRotatef(rz, 0, 0, 1);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存Draw_Table();                       // Draw table   glPopMatrix();}// Display func for main window
void renderScene() {glClearColor(1.0, 1.0, 1.0, 0.0);glutSwapBuffers();glutSetWindow(mainWindow);glClear(GL_COLOR_BUFFER_BIT);glutPostRedisplay();
}// Display func for sub window 1
void renderScenesw1() {glutSetWindow(subWindow1);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();gluLookAt(0, 15.0f, 0, 0, 0, 0, 0.0f, 0.0f, 1.0f);glPushMatrix();drawMain();glPopMatrix();glutSwapBuffers();glutPostRedisplay();}// Display func for sub window 2
void renderScenesw2() {glutSetWindow(subWindow2);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();gluLookAt(15.0f, 0, 0, 0, 0, 0, 0.0f, 0.0f, 1.0f);glPushMatrix();drawMain();glPopMatrix();glutSwapBuffers();glutPostRedisplay();
}// Display func for sub window 3
void renderScenesw3() {glutSetWindow(subWindow3);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();gluLookAt(0, 0, 15.0f, 0, 0, 0, 0, -1, 0);glPushMatrix();drawMain();glPopMatrix();glutSwapBuffers();glutPostRedisplay();}// Global render func
void renderSceneAll()
{renderScene();renderScenesw1();renderScenesw2();renderScenesw3();
}

event.cpp

// event.cpp : 处理事件
//@author Birdy&C 2017.4.7
#include "table.h"void timer(int p)
{time++;if (time >= 30)  time = 0;if (loopr){glutTimerFunc(200, timer, 0);//循环}
}void mouse(int button, int state, int x, int y)
{if (button == GLUT_LEFT_BUTTON){if (state == GLUT_DOWN){mouseisdown = true; loopr = false;tx = x;ty = y;}else{mouseisdown = false;}}if (button == GLUT_RIGHT_BUTTON)if (state == GLUT_DOWN){loopr = true;glutTimerFunc(200, timer, 0);}
}void motion(int x, int y)
{if (mouseisdown == true)        //如果是鼠标左键按下拖动{rz += x - tx;                   //偏移量记录rx += y - ty;               tx = x;                         //更新坐标ty = y;glutPostRedisplay();}
}void special(int key, int x, int y)
{//上下左右键盘控制xz坐标方向上的平移switch (key){case GLUT_KEY_LEFT:mx += 0.2;glutPostRedisplay();break;case GLUT_KEY_RIGHT:mx -= 0.2;glutPostRedisplay();break;case GLUT_KEY_UP:mz += 0.2;glutPostRedisplay();break;case GLUT_KEY_DOWN:mz -= 0.2;glutPostRedisplay();break;}
}void keyboard(unsigned char key, int x, int y)
{//123改变自动移动方式//接收事件的时候改变坐标位置(使得满足作业要求)switch (key){case '1':rx = ry = rz = 0;mx = mz = 0;mx = 5;state = 1;break;case '2':rx = ry = rz = 0;mx = mz = 0;state = 2;break;case '3':rx = ry = rz = 0;mx = mz = 0;mx = -5;state = 3;break;}
}void setProjection(int width, int height)
{glViewport(0, 0, width, height);                        // Reset The Current ViewportglMatrixMode(GL_PROJECTION);                            // Select The Projection MatrixglLoadIdentity();                                       // Reset The Projection Matrix// Calculate The Aspect Ratio Of The WindowgluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);glMatrixMode(GL_MODELVIEW);                             // Select The Modelview MatrixglLoadIdentity();                                       // Reset The Modelview Matrix
}void reshape(int w1, int h1) {if (h1 == 0)h1 = 1;// we're keeping these values cause we'll need them latterw = w1;h = h1;// set subwindow 1 as the active windowglutSetWindow(subWindow1);// resize and reposition the sub windowglutPositionWindow(border, border);glutReshapeWindow(w - 2 * border, h / 2 - border * 3 / 2);setProjection(w - 2 * border, h / 2 - border * 3 / 2);// set subwindow 2 as the active windowglutSetWindow(subWindow2);// resize and reposition the sub windowglutPositionWindow(border, (h + border) / 2);glutReshapeWindow(w / 2 - border * 3 / 2, h / 2 - border * 3 / 2);setProjection(w / 2 - border * 3 / 2, h / 2 - border * 3 / 2);// set subwindow 3 as the active windowglutSetWindow(subWindow3);// resize and reposition the sub windowglutPositionWindow((w + border) / 2, (h + border) / 2);glutReshapeWindow(w / 2 - border * 3 / 2, h / 2 - border * 3 / 2);setProjection(w / 2 - border * 3 / 2, h / 2 - border * 3 / 2);
}

main.cpp

// main.cpp : 定义控制台应用程序的入口点。
//@author Birdy&C 2017.4.7#include "table.h"//子窗口
int mainWindow, subWindow1, subWindow2, subWindow3;
//旋转记录
int rx = 0;
int ry = 0;
int rz = 0;
//平移记录
float mx = 0;
float mz = 0;
//鼠标位置
int tx, ty;
//边界宽度
const int border = 6;
//主窗口大小
int w, h;
//自动事件控制
bool mouseisdown = false;
bool loopr = false;
int state = 1;
int time = 0;
//存储纹理
GLuint  texture[1]; //初始化
void init()
{//纹理控制部分//glCullFace(GL_BACK);              //背面裁剪(背面不可见)//glEnable(GL_CULL_FACE);           //启用裁剪glEnable(GL_DEPTH_TEST);            //深度测试glEnable(GL_TEXTURE_2D);LoadGLTextures();                   //载入纹理贴图//事件处理部分glutIgnoreKeyRepeat(0);             //确认是否忽略自动的连续击键glutMouseFunc(mouse);               //鼠标点击事件glutMotionFunc(motion);             //鼠标拖动事件glutKeyboardFunc(keyboard);         //键盘事件glutSpecialFunc(special);           //特殊键盘 没有ASCII值 如上下左右//光照控制部分GLfloat DiffuseLightn[] = { 1.0, 1.0, 1.0, 0.0 };GLfloat light_position1[] = { 10.0, 20.0, 30.0, 0.0 };GLfloat light_position2[] = { 10.0, 10.0, -30.0, 0.0 };glLightfv(GL_LIGHT0,  GL_DIFFUSE, DiffuseLightn);glLightfv(GL_LIGHT0, GL_POSITION, light_position1);glLightfv(GL_LIGHT1, GL_DIFFUSE, DiffuseLightn);glLightfv(GL_LIGHT1, GL_POSITION, light_position2);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glDepthFunc(GL_LESS);}int main (int argc,  char *argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);glutInitWindowSize(640,480);mainWindow = glutCreateWindow("Birdy");LoadGLTextures();            //载入纹理贴图glutDisplayFunc(renderSceneAll);glutReshapeFunc(reshape);init();//子窗口建立subWindow1 = glutCreateSubWindow(mainWindow, border, border, w - 2 * border, h / 2 - border * 3 / 2);glutDisplayFunc(renderScenesw1);init();subWindow2 = glutCreateSubWindow(mainWindow, border, (h + border) / 2, w / 2 - border * 3 / 2, h / 2 - border * 3 / 2);glutDisplayFunc(renderScenesw2);init();subWindow3 = glutCreateSubWindow(mainWindow, (w + border) / 2, (h + border) / 2, w / 2 - border * 3 / 2, h / 2 - border * 3 / 2);glutDisplayFunc(renderScenesw3);init();glutMainLoop();return 0;
}

OpenGL实验(二三代码整理)桌子相关推荐

  1. OpenGL实验(三)桌子的纹理 光照

    由上一篇继续对桌子表现的探索~ 纹理 (显然)有非常多关于纹理的教程,可以任意选择进行了解. 下面贴这个链接是因为它附了代码(没错就那么简单粗暴--) http://blog.163.com/lian ...

  2. OpenGL 实验一 绘制简单图形

    OpenGL实验一 OpenGL简介: (英语:Open Graphics Library,译名:开放图形库或者"开放式图形库")是用于渲染2D.3D矢量图形的跨语言.跨平台的应用 ...

  3. 计算机图形Opengl的实验报告,计算机图形学OpenGL实验四.doc

    计算机图形学OpenGL实验四 实验报告 学院(系)名称: 姓名学号专业班级实验项目实验四:场景漫游课程名称计算机图形学课程代码实验时间实验地点批改意见成绩教师签字:实验环境(软.硬件环境) 实验目的 ...

  4. 红外和可见光图像融合论文及代码整理

    红外和可见光图像融合论文及代码整理 News [2022-07-29] 我们的综述论文<基于深度学习的图像融合方法综述>被<中国图象图形学报>正式接收![论文下载] 本篇博文在 ...

  5. OpenGL实验:绘制彩色五角星

    OpenGL实验:绘制彩色五角星 第二次编程作业内容 用配置好的OpenGL环境实现彩色五角星效果,以及把五角星作为3D对象绘制出来,通过按键能够调整角度(用J.K.L三个键分别控制三个互相正交方向上 ...

  6. 微型计算机实验代码,上师大,微型计算机实验全代码.doc

    上师大,微型计算机实验全代码 实验一 LED实验 C8255 EQU 21AH CW8255 EQU 21BH CODE SEGMENT ASSUME CS:CODE,DS:CODE START: P ...

  7. html移动端隐藏代码,html Css PC 移动端 公用部分样式代码整理

    css常用公用部分样式代码整理: body, html, div, blockquote, img, label, p, h1, h2, h3, h4, h5, h6, pre, ul, ol, li ...

  8. php图文消息带代码详细注释,微信发送图文消息代码整理

    微信发送图文消息代码整理 这个就不多说什么了, 下单成功后微信提示图文消息.核心代码如下 if(!empty($openid)){ $wxinfo=curlgetcontents("http ...

  9. 常用代码整理(重要)

    常用代码整理: 1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex ...

最新文章

  1. 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算
  2. 小tips:JS之按位取反,语法标签label,正则表达式中replace的0,1是什么?
  3. python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO
  4. stm32 交换机芯片_基于STM32的全链路语音交互 - stm32/stm8 - 电子工程世界
  5. springboot中获取bean_最新Spring Boot干货总结(超详细,建议收藏)
  6. Apache Subversion 1.7.2发布,开源版本控制工具
  7. oracle视图可以带日期变量么,创建视图时日期字段如何只都天
  8. VC 2010 Express下安装OpenCV2.4.4 遇到的问题
  9. php 百分比,小数2位
  10. 人机交互式编程_并发编程从操作系统底层工作整体认识开始
  11. 事记:关于远控软件导致win10屏幕亮度无法调节的解决方案
  12. vm安装android,Vmware虚拟机安装安卓4.0系统教程
  13. Pytorch加载.pth文件
  14. Windows API大全
  15. tbody 不能充满table的原因
  16. Excel转PDF 一百行代码超简单
  17. 南京中软/软通/金证/易宝等外包公司面试题
  18. 基于智能移动设备的IP电话软件的设计与实现
  19. wps使用xml文件显示ui
  20. EPSON ESC/POS指令

热门文章

  1. 如何使用计算机办公软件,如何正确使用电脑办公软件?你肯定不知道这些?
  2. Unix, Linux 和MacOS
  3. python世界那么大_世界这么大,Python 也想去看看
  4. 【物理应用】Matlab模拟人行走的微多普勒效应
  5. mysql php b s_PHP-- B/S结构
  6. 计算机的假桌面,原来大神的电脑桌面是这样子的!网友:感觉自己用了25年的假电脑...
  7. 最小二乘法实现C++
  8. 网站面临的主要漏洞和安全研究员发现问题
  9. 《Adobe Audition CS6中文版经典教程》——第2课 Audition环境 2.1 Audition双重身份
  10. 该死的dudu加速器广告终于被清除了