#define WIN32_LEAN_AND_MEAN //定制所用的函数库
#include <windows.h> //主要的Windows头文件
//装载OpenGL的lib库文件
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glaux.lib")
//装载OpenGL头文件
#include <gl/gl.h> //标准OpenGL头文件
#include <gl/glu.h> //OpenGL实用工具库
#include <gl/glaux.h> //OpenGL辅助函数库
//全局变量
float angle=0.0f; //当前视点角度
HDC g_HDC; //全局设备环境
bool fullScreen=false; //全屏变量
//机器人变量
float legAngle[2]={0.0f,0.0f}; //每条腿当前的角度
float armAngle[2]={0.0f,0.0f}; //每个手臂的当前角度
//此函数在指定点绘制一个立方体
void DrawCube(float xPos,float yPos,float zPos)
{
glPushMatrix(); //压栈
glTranslatef(xPos,yPos,zPos); //平移
glBegin(GL_POLYGON); //画多边形
glVertex3f(0.0f,0.0f,0.0f); //顶面
glVertex3f(0.0f,0.0f,-1.0f);
glVertex3f(-1.0f,0.0f,-1.0f);
glVertex3f(-1.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f); //正面
glVertex3f(-1.0f,0.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);
glVertex3f(0.0f,-1.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f); //右面
glVertex3f(0.0f,-1.0f,0.0f);
glVertex3f(0.0f,-1.0f,-1.0f);
glVertex3f(0.0f,0.0f,-1.0f);
glVertex3f(-1.0f,0.0f,0.0f); //左面
glVertex3f(-1,0,-1);
glVertex3f(-1,-1,-1);
glVertex3f(-1,-1,0);
glVertex3f(0,0,0); //底面
glVertex3f(0,-1,-1);
glVertex3f(-1,-1,-1);
glVertex3f(-1,-1,0);
glVertex3f(0,0,0); //背面
glVertex3f(-1,0,-1);
glVertex3f(-1,-1,-1);
glVertex3f(0,-1,-1);
glEnd();
glPopMatrix(); //出栈
}
//绘制机器人的一条手臂
void DrawArm(float xPos,float yPos,float zPos)
{
glPushMatrix(); //压栈
glColor3f(1.0f,0.0f,0.0f); //红色
glTranslatef(xPos,yPos,zPos);
glScalef(1.0f,4.0f,1.0f); //缩放,机器人手臂是一个1*4*1的立方体
DrawCube(0.0f,0.0f,0.0f); //绘制立方体
glPopMatrix(); //出栈
}
//绘制机器人头部
void DrawHead(float xPos,float yPos,float zPos)
{
glPushMatrix();
glColor3f(1.0f,1.0f,1.0f); //白色
glTranslatef(xPos,yPos,zPos);
glScalef(2.0f,2.0f,2.0f); //头部是一个2*2*2的立方体
DrawCube(0.0f,0.0f,0.0f);
glPopMatrix();
}
//绘制机器人的躯干
void DrawTorso(float xPos,float yPos,float zPos)
{
glPushMatrix();
glColor3f(0.0f,0.0f,1.0f); //蓝色
glTranslatef(xPos,yPos,zPos);
glScalef(3.0f,5.0f,2.0f); //躯干是一个3*5*2的立方体
DrawCube(0.0f,0.0f,0.0f);
glPopMatrix();
}
//绘制机器人的一条腿
void DrawLeg(float xPos,float yPos,float zPos)
{
glPushMatrix();
glColor3f(1.0f,1.0f,0.0f); //黄色
glTranslatef(xPos,yPos,zPos);
glScalef(1.0f,5.0f,1.0f); //腿是一个1*5*1的立方体
DrawCube(0.0f,0.0f,0.0f);
glPopMatrix();
}
//在xPos,yPos,zPos处绘制机器人
void DrawRobot(float xPos,float yPos,float zPos)
{
static bool leg1=true; //机器人腿的状态
static bool leg2=false; //true=前,false=后
static bool arm1=true;
static bool arm2=false;
glPushMatrix(); //当前矩阵压入堆栈
glTranslatef(xPos,yPos,zPos);
//绘制部件
DrawHead(1.0f,2.0f,0.0f);
DrawTorso(1.5f,0.0f,0.0f);
glPushMatrix(); //当前矩阵压入堆栈
//如果手臂向前移动,则增大角度,否则减小角度
if(arm1==true)
{ armAngle[0] = armAngle[0] + 1.0f; }
else
{ armAngle[0] = armAngle[0] - 1.0f; }
//一旦手臂在一个方向上达到最大值,就将其反转
if(armAngle[0]>=15.0f)
{ arm1=false; }
if(armAngle[0]<=-15.0f)
{ arm1=true; }
//移动并旋转手臂,以产生行走的效果
glTranslatef(0.0f,-0.5f,0.0f); //移动
glRotatef(armAngle[0],1.0f,0.0f,0.0f); //旋转
DrawArm(2.5f,0.0f,-0.5f); //绘制手臂
glPopMatrix(); //出栈
glPushMatrix(); //压栈
//如果手臂向前移动,则增大角度,否则减小角度
if(arm2==true)
{ armAngle[1] = armAngle[1] + 1.0f; }
else
{ armAngle[1] = armAngle[1] - 1.0f; }
//一旦手臂在一个方向上达到最大值,就将其反转
if(armAngle[1]>=15.0f)
{ arm2=false; }
if(armAngle[1]<=-15.0f)
{ arm2=true; }
//移动并旋转手臂,以产生行走的效果
glTranslatef(0.0f,-0.5f,0.0f); //移动
glRotatef(armAngle[1],1.0f,0.0f,0.0f); //旋转
DrawArm(-1.5f,0.0f,-0.5f); //绘制手臂
glPopMatrix(); //出栈
//要在空间中相对于机器人的位置来旋转腿
//下面是对Leg1——右腿的操作
glPushMatrix();
//如果腿向前移动,则增大角度,否则减小角度
if(leg1==true)
{ legAngle[0] = legAngle[0] + 1.0f; }
else
{ legAngle[0] = legAngle[0] - 1.0f; }
//一旦手臂在一个方向上达到最大值,就将其反转
if(legAngle[0]>=15.0f)
{ leg1=false; }
if(legAngle[0]<=-15.0f)
{ leg1=true; }
//移动并旋转腿,以产生行走的效果
glTranslatef(0.0f,-0.5f,0.0f); //移动
glRotatef(legAngle[0],1.0f,0.0f,0.0f); //旋转
DrawLeg(-0.5f,-5.0f,-0.5f); //绘制手臂
glPopMatrix(); //出栈
//对Leg2作同样的处理
glPushMatrix();
//如果腿向前移动,则增大角度,否则减小角度
if(leg2==true)
{ legAngle[1] = legAngle[1] + 1.0f; }
else
{ legAngle[1] = legAngle[1] - 1.0f; }
//一旦手臂在一个方向上达到最大值,就将其反转
if(legAngle[1]>=15.0f)
{ leg2=false; }
if(legAngle[1]<=-15.0f)
{ leg2=true; }
//移动并旋转腿,以产生行走的效果
glTranslatef(0.0f,-0.5f,0.0f); //移动
glRotatef(legAngle[1],1.0f,0.0f,0.0f); //旋转
DrawLeg(1.5f,-5.0f,-0.5f); //绘制手臂
glPopMatrix(); //出栈
glPopMatrix(); //出栈
}
//处理场景绘制
void Render()
{
glEnable(GL_DEPTH_TEST); //启用深度检测
//在此处绘制
glClearColor(0.0f,0.0f,0.0f,0.0f); //设置清理色为黑色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清理颜色、深度缓存
glLoadIdentity(); //复位模型视图矩阵
angle=angle+1.0f; //递增旋转角度计数器
if(angle>=360.0f) //如果已经旋转了一周,复位计数器
{ angle=0.0f; }
glPushMatrix(); //当前矩阵压入堆栈
glLoadIdentity(); //复位矩阵
glTranslatef(0.0f,0.0f,-30.0f); //平移至(0,0,-30)
glRotatef(angle,0.0f,1.0f,0.0f); //绕y轴旋转机器人
DrawRobot(0.0f,0.0f,0.0f); //绘制机器人
glPopMatrix(); //退栈
glFlush();
SwapBuffers(g_HDC); //交换前后缓存
}
void SetupPixelFormat(HDC hDC) //为设备环境设置像素格式
{
int nPixelFormat; //像素格式变量
static PIXELFORMATDESCRIPTOR pfd={
sizeof(PIXELFORMATDESCRIPTOR), //数据结构大小
1, //版本号,总设为1
PFD_DRAW_TO_WINDOW | //支持窗口
PFD_SUPPORT_OPENGL | //支持OpenGL
PFD_DOUBLEBUFFER, //支持双缓存
PFD_TYPE_RGBA, //RGBA颜色模式
32, //32位颜色模式
0,0,0,0,0,0, //忽略颜色为,不使用
0, //无alpha缓存
0, //忽略偏移位
0, //无累积缓存
0,0,0,0, //忽略累积位
16, //16位z-buffer(z缓存)大小
0, //无模板缓存
0, //无辅助缓存
PFD_MAIN_PLANE, //主绘制平面
0, //保留的数据项
0,0,0}; //忽略层面掩模
//选择最匹配的像素格式,返回索引值
nPixelFormat=ChoosePixelFormat(hDC,&pfd);
//设置环境设备的像素格式
SetPixelFormat(hDC,nPixelFormat,&pfd);
}
//Windows Procedure 事件处理
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HGLRC hRC; //绘制环境
static HDC hDC; //设备环境
int width,height; //窗口高度和宽度
switch(message)
{
case WM_CREATE: //窗口被创建
hDC=GetDC(hwnd); //得到当前窗口的设备环境
g_HDC=hDC;
SetupPixelFormat(hDC); //调用像素格式设置函数
hRC=wglCreateContext(hDC); //创建一个指向OpenGL绘制环境的句柄
wglMakeCurrent(hDC,hRC); //将传递过来的绘制环境设置为OpenGL将要进行绘制的当前绘制环境
return 0;
break;
case WM_CLOSE: //窗口被关闭
wglMakeCurrent(hDC,NULL); //取�
yinhexi.zip_openGL 银_银河系
版权申诉
128 浏览量
2022-09-22
21:10:03
上传
评论
收藏 336KB ZIP 举报
局外狗
- 粉丝: 66
- 资源: 1万+
最新资源
- 基于图像的三维模型重建C++源代码+文档说明(高分课程设计)
- 基于聚焦法的工件立体测量方案,根据数据进行三维重建 使用HALCON处理图像,MATLAB拟合数据+源代码+数据集+效果图
- 锄战三国村 修改:货币使用不减 v1.10(2) 原创 (中文).apk
- 基于python实现的单目双目视觉三维重建+源代码+图像图片(高分课程设计)
- 基于C+++OPENCV的全景图像拼接源码(课程设计)
- 基于Python+OpenCV对多张图片进行全景图像拼接,消除鬼影,消除裂缝+源代码+文档说明+界面截图(高分课程设计)
- 基于C++实现的全景图像拼接源码(课程设计)
- 基于SIFT特征点提取和RASIC算法实现全景图像拼接python源码+文档说明+界面截图+详细注释(95分以上课程大作业)
- 基于matlab实现眼部判别的疲劳检测系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
- 基于Matlab的异常姿势识别系统+源代码+全部数据+文档说明+详细注释+使用说明+截图(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈