工控网首页
>

应用设计

>

基于VC++6.0和OpenGL的机械手臂控制系统的模拟界面

基于VC++6.0和OpenGL的机械手臂控制系统的模拟界面

2004/6/17 13:42:00
1 引言   OpenGL是在SGI Microsoft DEC IBM 和Intel等多家世界著名计算机公司的倡导下,基于SGI的GL标准,制定的一个通用共享的开放式三维图形标准。OpenGL实际上是一种图形与硬件的接口。在仿真三维立体建模、虚拟现实技术、3D游戏开发等领域,OpenGL起着重要作用。   Visual C++是当前最为流行的软件开发工具之一,它汇集了微软公司的技术精华,不仅全面的贯彻了面向对象技术,而且在编译优化技术方面较其它同类产品具有明显的优势。它是一个彻底的程序员级的开发环境,“可视化”的设计减少了不少编程的工作量。Visual C++6.0更加适应当今计算机网络化 运行速度快 以及加强数据传输的优势。成为软件开发的首选工具。   当前在Visual C++6.0中已经集成了OpenGL图形标准,使得OpenGL在三维图形设计领域得到广泛应用。 2 OpenGL的实现原理 2.1 OpenGL的工作结构   OpenGL的指令的解释模型是客户/服务器模型,即客户(试图用OpenGL进行绘制工作的应用程序)向服务器(OpenGL内核)发布命令,这些OpenGL命令则是由服务器来解释的。在大多数情况下,客户和服务器是运行在同一台计算机的。基于客户/服务器模式,在网络环境中很容易使用OpenGL,且在不同计算机上的多个客户可以得到在其他计算机上服务器的服务。   OpenGL的库函数被封装在Opengl32.dll动态链接库中。从客户应用程序发布的对OpenGL函数的调用首先被Opengl32.dll处理,在传给服务器后,被进一步处理,然后传给DDI,最后传递给视频显示驱动程序。 2.2 OpenGL的图形操作步骤 运用OpenGL在计算机屏幕上绘出三维场景的基本步骤是: 第一,设置像素格式。像素格式告诉OpenGL绘制风格、颜色模式、 颜色位数等重要信息。 第二,建立模型。根据基本图元建立景物的三维模型,并对模型进行数学描述。 第三,舞台布置。把景物放置在三维空间的适当位置,设置三维透视视觉体以观察场景。 第四,效果处理。设置物体的材质,加入光照及光照条件。 第五,光栅化。把景物及其颜色信息转化为可在计算机屏幕上显示的像素信息。 2.3 OpenGL的基本程序结构   OpenGL编程类似与C编程,实际接口就是C,所以很多有关OpenGL的书中的程序都是使用标准C(或是Win32 Console Application)调用OpenGL函数实现的。 例1用标准C编写一个简单的例子来说明OpenGL的基本程序结构,此例子为一个绕y轴旋转的线框型茶壶。 例1 OpenGl例程MyTeapot.C #include #include "gl.h"//基本库 #include "glu.h"//实用库 #include "glaux.h"//辅助库 #include void init (void);void CALLBACK Reshape (GLsizei w,GLsizei h); void CALLBACK display (void);void CALLBACK stepdisplay (void); int symbol=1; float rot=0; void init (void) { glClearColor(0.0,0.0,0.0,0.0);//将窗口清为黑色 } void CALLBACK stepdisplay (void) { rot+=4; if(rot>360) rot=0; display (); } void CALLBACK display (void) { glClear (GL_COLOR_BUFFER_BIT);//将当前颜色缓存清为窗口的颜色 glPushMatrix(); glTranslatef(0.0,0.0,-80); if (symbol) glRotatef(rot,0,1,0); else glTranslatef(0,0,-rot); glColor3f(0,1,0.5);//设置颜色 auxWireTeapot(20.0);//绘制一个线框型的茶壶 glPopMatrix(); glFlush();//强制绘图完成 auxSwapBuffers();//交换两个颜色缓冲区的内容 } void CALLBACK Reshape (GLsizei w,GLsizei h) { if(h= =0) h=1; glViewport(0,0,w,h)//定义视口; glMatrixMode(GL_PROJECTION);//定义操作矩阵的类型为投影操作矩阵 glLoadIdentity(); gluPerspective(90,w/h,1.0,200);//定义了一个四棱台视景体 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void main(void) { auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);// RGBA和双缓冲模式 auxInitPosition(0,0,400,360);//指定要建立的窗口在屏幕窗口中的位置和大小 auxInitWindow("My Teapot ");//显示窗口标题 init(); auxReshapeFunc(Reshape); auxIdleFunc(stepdisplay); auxMainLoop(display); } 3 VC++6.0中的OpenGL编程 1)创建一个新的单文档工程,名字为Nehe。 2)包含头文件与函数库文件。在CNeheView.h文件首部添加头文件的包含 #include "gl.h"//基本库 #include "glu.h"//实用库 #include "glaux.h"//辅助库 选择Tool|Options菜单命令添加头文件包含语句,选择菜单命令Project|Settings添加库文件包含。 3)设置像素格式。先在CNeheView.h中添加保护成员函数bSetupPixelFormat(), 添加保护成员函数Init(),声明两个公有成员:CClientDC*m_pDC; CRect m_Rect;在构造函数 CNeheView()中对m_pDC进行初始化。编辑bSetupPixelFormat()函数。 BOOL CNeheView::bSetupPixelFormat() {static PIXELFORMATDESCRIPTOR pfd=//初始化像素格式 { sizeof(PIXELFORMATDESCRIPTOR),// pfd的大小 1, //版本号 PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_TYPE_RGBA, 24, 0,0,0,0,0,0,//24位颜色深度,缺省的颜色位面数 0,0,0, //没有alpha缓冲, 忽略shift位, 没有累积缓冲区 0,0,0,0, //忽略的累积位 32,0,0, //32位深度缓冲区, 没有模板缓冲区, 没有辅助缓冲区 PFD_MAIN_PLANE, //主要层次方式 0, 0,0,0 //保留位,屏蔽层次掩模 }; int pixelformat; if ((pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd))==0) {MessageBox("ChoosePixelFormat failed"); return FALSE; } if (SetPixelFormat(m_pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE) {MessageBox("SetPixelFormat failed"); return FALSE; } return TRUE; } 4)创建着色描述表并当前化着色描述表。编辑Init()函数。 5)删除着色描述表。添加WM_DESTROY消息,生成OnDestroy()函数。在OnCreate()函数中调用Init()函数。 6)增加WM_SIZE消息,生成消息响应函数OnSize(),编辑该函数。 7)选择函数PreCreateWindow(CREATESTRUCT& cs),编辑该函数。 8)在OnDraw()函数中完成绘制工作 4 应用实例 4.1 机械手臂控制系统的简介   在本实例中,我们模拟的是一机械手臂控制系统。系统的工作过程如下所示: 1)控制机械手臂运动到工件上方,并夹取工件。 2)然后控制机械手臂运动到检测装置(声腔)处,检测完成后,控制下料筒到相应位置。 3)然后让机械手臂运动到下料口上方,放入工件。 4)机械手臂复位,重复以上操作。   创建一个基于CFormView的单文档工程,取名为RobortArm。在对话框IDD_ROBORTARM_FORM的上方添加一个ID号为IDC_BUTTONDRAW的按纽,并为其添加消息响应函数OnButtondraw(),在函数OnButtondraw()中完成绘制工作。在绘制一个复杂的实际系统时,有很多代码是重复的。为了减少由于重复拷贝而造成的应用程序冗长以及对系统资源的占用,我们在本程序中采用了动态链接库。   动态链接库DLL(Dynamic Link Library)是一种基于Windows的程序模块,它是一个包含函数的库文件,可以在运行时被装入和链接。动态链接库DLL和其他C++库的区别在于,动态链接库DLL是在运行时和应用程序链接,而不是在编译、链接的过程中被调用。要使用动态链接库DLL,必须将动态链接库相应的DLL文件拷贝到一定的目录下,在本实例中,我们将DLL文件放到了应用程序所在的子目录下。   一个应用程序链接DLL的方法有两种:显式链接和隐式链接。显式链接指动态加载或运行时的链接;隐式链接指静态加载或加载时动态链接。在本实例中,应用的是隐式链接。例如:在DLL代码中,声明了圆柱体和立方体的导出函数分别为: __declspec(dllexport) void DrawCylinder(GLdouble dTopRadius = 1.0, // 顶面半径 GLdouble dBottomRadius = 1.0, // 底面半径 GLdouble dLength = 1.0, // 长度 GLdouble dXRotatePtRatio = 0.5, // X轴旋转比率 int nSlice = 20, // 等分数 int Mask = 0xFF, // 面掩码 GLint* pTexPtr = 0, // 贴图指针 int nType = 2 // 贴图类型 ); __declspec(dllexport) void DrawCube(GLfloat CX = 1.0f, // X轴长度 GLfloat CY = 1.0f, // Y轴长度 GLfloat CZ = 1.0f, // Z轴长度 int Mask = 0xFF, // 面掩码 GLint* pTexPtr = 0, // 贴图指针 int nType = 2 // 贴图类型 ); 系统由基本的圆柱体和立方体构成,部分数据结构如下: //定义水平平台的长、宽、高 #define LengthLevel 1.7f #define WidthLevel 0.9f #define HeightLevel 0.015f //定义倾斜平台支柱的长、宽、高 #define LengthBrace 0.04f #define WidthBrace 0.04f #define HeightBrace 0.4f //定义放料箱的长、宽、高 #define LengthBox 0.05f #define WidthBox 0.06f #define HeightBox 0.05f //定义物料轮的半径和高度 #define RadiusDisk 0.14f #define HeightDisk 0.02f //定义工件的半径和高度 #define RadiusWorkPiece
投诉建议

提交

查看更多评论
其他资讯

查看更多

PLC一体机之EK温度修正使用技巧

S7-300CPU存储器介绍及存储卡使用

0.05级超高精度互感器

DC-DC转换器(电源模块)应用指南——外接滤波电容选配

施罗德最小流量阀的应用范围及优点