⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3d.cpp

📁 我们使用多边形和四边形创建3D物体
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
 *		这些代码是由Jeff Molofee 与2000年写的,再次我必须感谢Fredric Echols,因为他使这些代码看起来更简洁和高效,并使他易于使用。
 *		如果你发现这些代码对你有所帮助,请访问我的站点 http://nehe.gamedev.net/default.asp ,并让我知道。
 *********************************************************************************************************************************
 *		这份文档是由DancingWind翻译的,如果有什么错误请e-mail:zhouwei02@mails.tsinghua.edu.cn
 *		基于04_Rotate。cpp文件修改
 *		//old code			//不用了代码用//删除
 *		/********************************************************************************************************************/	/*
 *		new code			//新的代码位于两排/*************/ /*之间,便于查找
 *		/********************************************************************************************************************/	/*
/***********************************新添的代码***********************************************************************************/
/********************************************************************************************************************************/
/*********************包含链接的库文件*******************************************************************************************/
#pragma comment( lib, "opengl32.lib" )				
#pragma comment( lib, "glu32.lib" )	
#pragma comment( lib, "glut32.lib")
#pragma comment( lib, "glew32.lib")
#pragma comment( lib, "glaux.lib")
#pragma comment( lib, "vfw32.lib" )	
/********************************************************************************************************************************/
#include <windows.h>		// Windows的头文件
#include "glew.h"			// 包含最新的gl.h,glu.h库
#include "glut.h"			// 包含OpenGL实用库

HDC			hDC=NULL;		// 窗口着色描述表句柄
HGLRC		hRC=NULL;		// OpenGL渲染描述表句柄
HWND		hWnd=NULL;		// 保存我们的窗口句柄
HINSTANCE	hInstance;		// 保存程序的实例

bool	keys[256];			// 保存键盘按键的数组
bool	active=TRUE;		// 窗口的活动标志,缺省为TRUE
bool	fullscreen=TRUE;	// 全屏标志缺省,缺省设定成全屏模式
GLfloat		rtri;			// 用于三角形的角度
GLfloat		rquad;			// 用于四边形的角度

LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	// WndProc的定义

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)		// 重置OpenGL窗口大小
{
	if (height==0)										// 防止被零除
	{
		height=1;										// 将Height设为1
	}

	glViewport(0,0,width,height);						// 重置当前的视口

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

	// 设置视口的大小
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

	glMatrixMode(GL_MODELVIEW);							// 选择模型观察矩阵
	glLoadIdentity();									// 重置模型观察矩阵
}

int InitGL(GLvoid)										// 此处开始对OpenGL进行所有设置
{
	glShadeModel(GL_SMOOTH);							// 启用阴影平滑
	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				// 黑色背景
	glClearDepth(1.0f);									// 设置深度缓存
	glEnable(GL_DEPTH_TEST);							// 启用深度测试
	glDepthFunc(GL_LEQUAL);								// 所作深度测试的类型
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// 告诉系统对透视进行修正
	return TRUE;										// 初始化 OK
}

int DrawGLScene(GLvoid)									// 从这里开始进行所有的绘制
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// 清除屏幕和深度缓存
	glLoadIdentity();									// 重置当前的模型观察矩阵
	glTranslatef(-1.5f,0.0f,-6.0f);						// 左移 1.5 单位,并移入屏幕 6.0
	glRotatef(rtri,0.0f,1.0f,0.0f);						// 绕Y轴旋转三角形
//	glBegin(GL_TRIANGLES);								// 绘制三角形
//		glColor3f(1.0f,0.0f,0.0f);						// 设置当前色为红色
//		glVertex3f( 0.0f, 1.0f, 0.0f);					// 上顶点
//		glColor3f(0.0f,1.0f,0.0f);						// 设置当前色为绿色
//		glVertex3f(-1.0f,-1.0f, 0.0f);					// 左下
//		glColor3f(0.0f,0.0f,1.0f);						// 设置当前色为蓝色
//		glVertex3f( 1.0f,-1.0f, 0.0f);					// 右下
//	glEnd();											// 三角形绘制结束
/***********************************新添的代码***********************************************************************************/
	glBegin(GL_TRIANGLES);								// 开始绘制金字塔的各个面
		glColor3f(1.0f,0.0f,0.0f);						// 红色
		glVertex3f( 0.0f, 1.0f, 0.0f);					// 三角形的上顶点 (前侧面)
		glColor3f(0.0f,1.0f,0.0f);						// 绿色
		glVertex3f(-1.0f,-1.0f, 1.0f);					// 三角形的左下顶点 (前侧面)
		glColor3f(0.0f,0.0f,1.0f);						// 蓝色
		glVertex3f( 1.0f,-1.0f, 1.0f);					// 三角形的右下顶点 (前侧面)

		glColor3f(1.0f,0.0f,0.0f);						// 红色
		glVertex3f( 0.0f, 1.0f, 0.0f);					// 三角形的上顶点 (右侧面)
		glColor3f(0.0f,0.0f,1.0f);						// 蓝色
		glVertex3f( 1.0f,-1.0f, 1.0f);					// 三角形的左下顶点 (右侧面)
		glColor3f(0.0f,1.0f,0.0f);						// 绿色
		glVertex3f( 1.0f,-1.0f, -1.0f);					// 三角形的右下顶点 (右侧面)

		glColor3f(1.0f,0.0f,0.0f);						// 红色
		glVertex3f( 0.0f, 1.0f, 0.0f);					// 三角形的上顶点 (后侧面)
		glColor3f(0.0f,1.0f,0.0f);						// 绿色
		glVertex3f( 1.0f,-1.0f, -1.0f);					// 三角形的左下顶点 (后侧面)
		glColor3f(0.0f,0.0f,1.0f);						// 蓝色
		glVertex3f(-1.0f,-1.0f, -1.0f);					// 三角形的右下顶点 (后侧面)

		glColor3f(1.0f,0.0f,0.0f);						// 红色
		glVertex3f( 0.0f, 1.0f, 0.0f);					// 三角形的上顶点 (左侧面)
		glColor3f(0.0f,0.0f,1.0f);						// 蓝色
		glVertex3f(-1.0f,-1.0f,-1.0f);					// 三角形的左下顶点 (左侧面)
		glColor3f(0.0f,1.0f,0.0f);						// 绿色
		glVertex3f(-1.0f,-1.0f, 1.0f);					// 三角形的右下顶点 (左侧面)
	glEnd();											// 金字塔绘制结束
/********************************************************************************************************************************/
//	glTranslatef(3.0f,0.0f,0.0f);						// 右移3单位
//	glColor3f(0.5f,0.5f,1.0f);							// 一次性将当前色设置为蓝色
//	glLoadIdentity();									// 重置模型观察矩阵
//	glTranslatef(1.5f,0.0f,-6.0f);						// 右移1.5单位,并移入屏幕 6.0
//	glRotatef(rquad,1.0f,0.0f,0.0f);					// 绕X轴旋转四边形
//	rtri+=0.2f;											// 增加三角形的旋转变量
//	rquad-=0.15f;										// 减少四边形的旋转变量
//	glBegin(GL_QUADS);									//  绘制正方形
//		glVertex3f(-1.0f, 1.0f, 0.0f);					// 左上
//		glVertex3f( 1.0f, 1.0f, 0.0f);					// 右上
//		glVertex3f( 1.0f,-1.0f, 0.0f);					// 左下
//		glVertex3f(-1.0f,-1.0f, 0.0f);					// 右下
//	glEnd();											// 正方形绘制结束
/***********************************新添的代码***********************************************************************************/
	glLoadIdentity();									// 把模型变换矩阵清零
	glTranslatef(1.5f,0.0f,-7.0f);						// 先右移再移入屏幕
	glRotatef(rquad,1.0f,1.0f,1.0f);					// 在XYZ轴上旋转立方体

	glBegin(GL_QUADS);									// 开始绘制立方体
		glColor3f(0.0f,1.0f,0.0f);						// 颜色改为蓝色
		glVertex3f( 1.0f, 1.0f,-1.0f);					// 四边形的右上顶点 (顶面)
		glVertex3f(-1.0f, 1.0f,-1.0f);					// 四边形的左上顶点 (顶面)
		glVertex3f(-1.0f, 1.0f, 1.0f);					// 四边形的左下顶点 (顶面)
		glVertex3f( 1.0f, 1.0f, 1.0f);					// 四边形的右下顶点 (顶面)

		glColor3f(1.0f,0.5f,0.0f);						// 颜色改成橙色
		glVertex3f( 1.0f,-1.0f, 1.0f);					// 四边形的右上顶点(底面)
		glVertex3f(-1.0f,-1.0f, 1.0f);					// 四边形的左上顶点(底面)
		glVertex3f(-1.0f,-1.0f,-1.0f);					// 四边形的左下顶点(底面)
		glVertex3f( 1.0f,-1.0f,-1.0f);					// 四边形的右下顶点(底面)

		glColor3f(1.0f,0.0f,0.0f);						// 颜色改成红色
		glVertex3f( 1.0f, 1.0f, 1.0f);					// 四边形的右上顶点(前面)
		glVertex3f(-1.0f, 1.0f, 1.0f);					// 四边形的左上顶点(前面)
		glVertex3f(-1.0f,-1.0f, 1.0f);					// 四边形的左下顶点(前面)
		glVertex3f( 1.0f,-1.0f, 1.0f);					// 四边形的右下顶点(前面)

		glColor3f(1.0f,1.0f,0.0f);						// 颜色改成黄色
		glVertex3f( 1.0f,-1.0f,-1.0f);					// 四边形的右上顶点(后面)
		glVertex3f(-1.0f,-1.0f,-1.0f);					// 四边形的左上顶点(后面)
		glVertex3f(-1.0f, 1.0f,-1.0f);					// 四边形的左下顶点(后面)
		glVertex3f( 1.0f, 1.0f,-1.0f);					// 四边形的右下顶点(后面)

		glColor3f(0.0f,0.0f,1.0f);						// 颜色改成蓝色
		glVertex3f(-1.0f, 1.0f, 1.0f);					// 四边形的右上顶点(左面)
		glVertex3f(-1.0f, 1.0f,-1.0f);					// 四边形的左上顶点(左面)
		glVertex3f(-1.0f,-1.0f,-1.0f);					// 四边形的左下顶点(左面)
		glVertex3f(-1.0f,-1.0f, 1.0f);					// 四边形的右下顶点(左面)

		glColor3f(1.0f,0.0f,1.0f);						// 颜色改成紫罗兰色
		glVertex3f( 1.0f, 1.0f,-1.0f);					// 四边形的右上顶点(右面)
		glVertex3f( 1.0f, 1.0f, 1.0f);					// 四边形的左上顶点(右面)
		glVertex3f( 1.0f,-1.0f, 1.0f);					// 四边形的左下顶点(右面)
		glVertex3f( 1.0f,-1.0f,-1.0f);					// 四边形的右下顶点(右面)
	glEnd();											// 立方体绘制结束

	rtri+=0.2f;											// 增加三角形的旋转变量
	rquad-=0.15f;										// 减少四边形的旋转变量
/********************************************************************************************************************************/
	return TRUE;										// 一切 OK
}

GLvoid KillGLWindow(GLvoid)								// 正常销毁窗口
{
	if (fullscreen)										// 我们处于全屏模式吗?
	{
		ChangeDisplaySettings(NULL,0);					// 是的话,切换回桌面
		ShowCursor(TRUE);								// 显示鼠标指针
	}

	if (hRC)											//我们拥有OpenGL描述表吗?
	{
		if (!wglMakeCurrent(NULL,NULL))					// 我们能否释放DC和RC描述表?
		{
			MessageBox(NULL,"释放DC或RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
		}

		if (!wglDeleteContext(hRC))						// 我们能否删除RC?
		{
			MessageBox(NULL,"释放RC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
		}
		hRC=NULL;										// 将RC设为 NULL
	}

	if (hDC && !ReleaseDC(hWnd,hDC))					// 我们能否释放 DC?
	{
		MessageBox(NULL,"释放DC失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
		hDC=NULL;										// 将 DC 设为 NULL
	}

	if (hWnd && !DestroyWindow(hWnd))					// 能否销毁窗口?
	{
		MessageBox(NULL,"释放窗口句柄失败。","关闭错误",MB_OK | MB_ICONINFORMATION);
		hWnd=NULL;										// 将 hWnd 设为 NULL
	}

	if (!UnregisterClass("OpenG",hInstance))			// 能否注销类?
	{
		MessageBox(NULL,"不能注销窗口类。","关闭错误",MB_OK | MB_ICONINFORMATION);
		hInstance=NULL;									// 将 hInstance 设为 NULL
	}
}

/*	这个函数创建我们OpenGL窗口,参数为:									*
 *	title			- 窗口标题												*
 *	width			- 窗口宽度												*
 *	height			- 窗口高度												*
 *	bits			- 颜色的位深(8/16/32)									*
 *	fullscreenflag	- 是否使用全屏模式,全屏模式(TRUE),窗口模式(FALSE)		*/
 
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{
	GLuint		PixelFormat;			// 保存查找匹配的结果
	WNDCLASS	wc;						// 窗口类结构
	DWORD		dwExStyle;				// 扩展窗口风格
	DWORD		dwStyle;				// 窗口风格
	RECT		WindowRect;				// 取得矩形的左上角和右下角的坐标值
	WindowRect.left=(long)0;			// 将Left   设为 0
	WindowRect.right=(long)width;		// 将Right  设为要求的宽度
	WindowRect.top=(long)0;				// 将Top    设为 0
	WindowRect.bottom=(long)height;		// 将Bottom 设为要求的高度

	fullscreen=fullscreenflag;			// 设置全局全屏标志

	hInstance			= GetModuleHandle(NULL);				// 取得我们窗口的实例
	wc.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;	// 移动时重画,并为窗口取得DC
	wc.lpfnWndProc		= (WNDPROC) WndProc;					// WndProc处理消息
	wc.cbClsExtra		= 0;									// 无额外窗口数据
	wc.cbWndExtra		= 0;									// 无额外窗口数据
	wc.hInstance		= hInstance;							// 设置实例
	wc.hIcon			= LoadIcon(NULL, IDI_WINLOGO);			// 装入缺省图标
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);			// 装入鼠标指针
	wc.hbrBackground	= NULL;									// GL不需要背景
	wc.lpszMenuName		= NULL;									// 不需要菜单
	wc.lpszClassName	= "OpenG";							// 设定类名字

	if (!RegisterClass(&wc))									// 尝试注册窗口类
	{
		MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;											// 退出并返回FALSE
	}
	
	if (fullscreen)												// 要尝试全屏模式吗?
	{
		DEVMODE dmScreenSettings;								// 设备模式
		memset(&dmScreenSettings,0,sizeof(dmScreenSettings));	// 确保内存清空为零
		dmScreenSettings.dmSize=sizeof(dmScreenSettings);		// Devmode 结构的大小
		dmScreenSettings.dmPelsWidth	= width;				// 所选屏幕宽度
		dmScreenSettings.dmPelsHeight	= height;				// 所选屏幕高度
		dmScreenSettings.dmBitsPerPel	= bits;					// 每象素所选的色彩深度

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -