📄 旋转四面体和六面体.txt
字号:
#include <windows.h> // Windows的头文件
#include <gl\gl.h> // OpenGL32库的头文件
#include <gl\glu.h> // GLu32库的头文件
#include <gl\glaux.h> // GLaux库的头文件
#include <stdio.h> // 标准输入/输出库的头文件
HGLRC hRC=NULL;
// 永久着色描述表
HDC hDC=NULL;
// 私有GDI设备描述表
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) // 重置并初始化GL窗口大小
{
if (height==0) // 防止被零除
{
height=1;
// 将Height设为1
}
glViewport(0, 0, width, height);
// 重置当前的视口(Viewport)
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.0f);
// 黑色背景
glClearDepth(1.0f);
// 设置深度缓存
glEnable(GL_DEPTH_TEST);
// 启用深度测试
glDepthFunc(GL_LEQUAL);
// 所作深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// 真正精细的透视修正
return TRUE;
// 初始化 OK
}
GLvoid KillGLWindow(GLvoid)
{
// 正常销毁窗口
if (fullscreen)
{
// 我们处于全屏模式吗?
ChangeDisplaySettings(NULL,0);
// 是的话,切换回桌面
ShowCursor(TRUE);
// 显示鼠标指针
}
if (hRC)
{
// 我们拥有着色描述表吗?
if (!wglMakeCurrent(NULL,NULL))
{
// 我们能否释放DC和RC描述表?
MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC))
{
// 我们能否删除RC?
MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL;
// 将RC设为 NULL
}
if (hDC && !ReleaseDC(hWnd,hDC)) // 我们能否释放 DC?
{
MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hDC=NULL;
// 将 DC 设为 NULL
}
if (hWnd && !DestroyWindow(hWnd)) // 能否销毁窗口?
{
MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hWnd=NULL;
// 将 hWnd 设为 NULL
}
if (!UnregisterClass("OpenGL",hInstance)) // 能否注销类?
{
MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hInstance=NULL;
// 将 hInstance 设为 NULL
}
}
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 = "OpenGL";
// 设定类名字
if (!RegisterClass(&wc)) // 尝试注册窗口类
{
MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
//退出并返回FALSE
}
if (fullscreen)
{
// 要尝试全屏模式吗?
DEVMODE dmScreenSettings;
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
// 设备模式
dmScreenSettings.dmSize=sizeof(dmScreenSettings);
// 确保内存分配
dmScreenSettings.dmPelsWidth = width;
// Devmode 结构的大小
dmScreenSettings.dmPelsHeight = height;
// 所选屏幕宽度
dmScreenSettings.dmBitsPerPel = bits;
// 所选屏幕高度
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
// 每象素所选的色彩深度
// 尝试设置显示模式并返回结果?注: CDS_FULLSCREEN 移去了状态条?
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{
// 若模式失败,提供两个选项:退出或在窗口内运行?
if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
fullscreen=FALSE;
// 选择窗口模式(Fullscreen=FALSE)
}
else
{
// 弹出消息窗口告知用户程序将结束?并返回FALSE告诉程序窗口未能成功创建?程序退出
MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
return FALSE;
//退出并返回 FALSE
}
}
}
if (fullscreen)// 仍处于全屏模式吗?
{
dwExStyle=WS_EX_APPWINDOW;
// 扩展窗体风格
dwStyle=WS_POPUP;
// 窗体风格
ShowCursor(FALSE);
// 隐藏鼠标指针
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
// 扩展窗体风格
dwStyle=WS_OVERLAPPEDWINDOW;
// 窗体风格
}
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
// 调整窗口达到真正要求的大小
if (!(hWnd=CreateWindowEx( dwExStyle,// 扩展窗体风格
"OpenGL", // 类名字
title, // 窗口标题
WS_CLIPSIBLINGS | // 必须的窗体风格属性
WS_CLIPCHILDREN | // 必须的窗体风格属性
dwStyle, // 选择的窗体属性
0, 0, // 窗口位置
WindowRect.right-WindowRect.left, // 计算调整好的窗口宽度
WindowRect.bottom-WindowRect.top, // 计算调整好的窗口高度
NULL, // 无父窗口
NULL, // 无菜单
hInstance, // 实例
NULL))) // 不向WM_CREATE传递任何东东
{
KillGLWindow();
// 重置显示区
MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// 返回 FALSE
}
static PIXELFORMATDESCRIPTOR pfd= //pfd 告诉窗口我们所希望的东东
{
sizeof(PIXELFORMATDESCRIPTOR), //上诉格式描述符的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 格式必须支持窗口
PFD_SUPPORT_OPENGL | // 格式必须支持OpenGL
PFD_DOUBLEBUFFER, // 必须支持双缓冲
PFD_TYPE_RGBA, // 申请 RGBA 格式
bits, // 选定色彩深度
0, 0, 0, 0, 0, 0, // 忽略的色彩位
0, // 无Alpha缓存
0, // 忽略Shift Bit
0, // 无聚集缓存
0, 0, 0, 0, // 忽略聚集位
16, // 16位 Z-缓存 (深度缓存)
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主绘图层
0, // 保留
0, 0, 0 // 忽略层遮罩
};
if (!(hDC=GetDC(hWnd))) //取得设备描述表了么?
{
KillGLWindow();
// 重置显示区
MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// 返回 FALSE
}
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Windows 找到相应的象素格式了吗?
{
KillGLWindow();
// 重置显示区
MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// 返回 FALSE
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // 能够设置象素格式么?
{
KillGLWindow();
// 重置显示区
MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// 返回 FALSE
}
if (!(hRC=wglCreateContext(hDC))) // 能否取得着色描述表?
{
KillGLWindow();
// 重置显示区
MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// 返回 FALSE
}
if(!wglMakeCurrent(hDC,hRC)) // 尝试激活着色描述表
{
KillGLWindow();
// 重置显示区
MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
// 返回 FALSE
}
ShowWindow(hWnd,SW_SHOW);
// 显示窗口
SetForegroundWindow(hWnd);
// 略略提高优先级
SetFocus(hWnd);
// 设置键盘的焦点至此窗口
ReSizeGLScene(width, height);
// 设置透视 GL 屏幕
if (!InitGL()) // 初始化新建的GL窗口
{
KillGLWindow();
// 重置显示区
MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -