Windows和Linux平台下的腰椎治疗仪实时仿真

时间:2022-05-11 02:54:43

摘要:腰椎治疗仪的实时仿真能给操作者提供实时直观的仪器状态。基于Mesa/OpenGL,分别在Windows和Linux平台下实现了三维多功能腰椎治疗仪的动态实时仿真。详细描述了其实现步骤,分析了在两种平台下程序的异同之处,并指出编程中应该注意的细节。根据实时动态输入的治疗仪参数实现实时动态仿真。

关键词:Mesa;OpenGL;Windows;Linux;实时仿真

中图分类号:TP391.9文献标识码:A文章编号:1009-3044(2012) 04-0931-04

The Real-time Simulation of Lumbar Curer under Windows and Linux

LIANG Lei1, WANG Xiu-li2

(1.Patent Examination Cooperation Beijing Center, Patent Office of State Intellectual Property Office, Beijing 100083, China; 2.School of Information, Central University of Finance and Economics, Beijing 100081, China)

Abstract: The real-time simulation of lumbar curer provides real-time and visual state of the instrument for operators. Based on Mesa/ OpenGL, the real-time dynamic simulation of a multi-function lumbar curer is implemented under Windows and Linux platforms respec? tively. The paper describes its detailed implementation steps, analyzes the two platforms program similarities and differences, and discusses the programming details that should be cared. The real-time dynamic simulation is produced according to real-time dynamic input param? eters of the instrument.

Key words: Mesa; OpenGL; Windows; Linux; real-time simulation

观众曾在电影《玩具总动员》、《泰坦尼克号》中看到由计算机合成制作的一幅幅美妙绝伦的画面,其底层是如何实现的呢?OpenGL(Open Graphics Library)[1]正是完成影片动画制作的底层工具。

一个优秀的图形编程接口应当满足如下标准:

1)它应当确保在多种平台间的顺利移植而不能以牺牲绘图性能为代价,也不应损害到用户对硬件的控制能力;

2)它应当提供一种简洁自然的方式以简化编程的复杂度;

3)它应当具备足够的柔韧性和连续性,易于扩展。

OpenGL恰恰具备了这些优势。这使得它迅速发展成为得到广泛认可的三维图形设计接口的工业标准。在计算机辅助设计、内容创作、能源、娱乐、游戏开发、制造业、制药业及虚拟现实等行业领域中,OpenGL能在个人计算机、工作站、超级计算机等硬件设备上实现高性能、极具冲击力的高视觉表现力的图形处理软件开发[2-3]。

基于Mesa/OpenGL,本文分别在Windows和Linux平台下实现了三维多功能腰椎治疗仪的动态实时仿真,根据实时动态输入的治疗仪参数实现实时动态仿真。

1 Mesa/OpenGL概述

OpenGL是一个开放的三维图形软件包,它独立于软硬件平台,可以采用C、C++、Java等多种语言编程,以它为基础开发的应用程序可以十分方便地在各种平台(如Windows、Unix、Linux及MacOS)间移植。OpenGL使用了一种客户端―服务器端的模式来解释命令。应用程序(客户端)所的命令将通过OpenGL(服务器端)来编译和处理。服务器的操作既可以同客户端在同一台计算机上进行,又可以分别属于不同的机器。因此,从这个意义上讲,OpenGL是网络透明的。一个服务器可以维护数个GL上下文,每个上下文被封装在一个GL状态里。服务器可以同时包含几个GL上下文,每个上下文都被封装在一个GL状态里。每个客户端都可以连接到这些上下文中的任何一个。

2011年8月9日在温哥华举行的SIGGRAPH 2011大会上Khronos工作组了新的OpenGL4.2标准细节,对于支持现有硬件的API加入了部分新的支持特性。和OpenGL4.1一样,OpenGL4.2主要应用于DX11级别硬件如NVIDIA GeForce 400/500,Radeon HD 5000/6000系列显卡,不过NVIDIA的开发者社区之前曾经表示部分特性可通过扩展功能在最老支持OpenGL2/DX9级别的硬件上实现。

OpenGL提供的操作包括:建模(Drawing Object)、变换(Transformer)、着色(Rendering)、光照(Lighting)、反走样(Antialiasing)、混合(Blending)、雾(Fog)、位图和图像(Bitmap and Image)、纹理映射(Texture Map)、交互操作和动画(Interactive and Animation)、深度暗示(Depth Cue)、运动模糊(Motion Blur)等。

Mesa是一种类似于OpenGL的开源实现[4],其核心函数的技术文档可以采用OpenGL的文档。Mesa/OpenGL有100多个核心库函数,其前缀是gl,还包括多种扩展库函数,如:glu(实用库)、glaux(辅助库)、gltk(工具库)、glx(对X-Window系统的扩展)及glut(实用工具库)。此外,在Windows平台下也集成了针对OpenGL的扩展函数,如一些WGL函数(前缀为wgl)和六个Win32函数(Choos? ePixelFormat、DescribePixelFormat、GetEnhMetaFilePixelFormat、GetPixelFormat、SetPixelFormat、SwapBuffers)。WGL函数专门用于OpenGL与Windows系统窗口的联系,可用来管理绘图描述表、显示列表及位图字符。Win32函数支持窗口的像素格式(Pixel Formats)和双缓冲,由于它们是对Win32系统的扩展,因此不能应用于其他OpenGL平台。

2 Mesa/OpenGL编程实现

Mesa/OpenGL程序的基本框架非常简明,如图1所示。

图1 Mesa/OpenGL程序基本结构

从图1看出,应用程序在初始化窗口后,即进入消息循环,所响应的消息包括鼠标、键盘以及系统消息。程序的框架是基本固定的,编程的主要工作则在于场景绘制部分(包括场景初始状态设置)。

以Medical为工程文件名,描述实时仿真系统在Windows和Linux下的实现。

2.1 Windows下的编程实现

Windows系统下的OpenGL程序通常要以VC++为开发工具,

1)在项目Project\Settings\Link的objects/librarymodule中设置如下:

OpenGL32.lib glu32.lib glaux.lib

OpenGL32.lib函数库文件包含一些重要信息,这些信息可帮助程序利用链接器访问动态链接库函数OpenGL32.DLL。而glu32. lib、glaux.lib则表示要用到OpenGL实用库函数及辅助库函数。

2)在CmedicalView.h文件首部需要添加以下几个头文件:

#include "gl\gl.h";

#include "gl\glu.h";

#include "gl\glaux.h";

3)设定OpenGL风格

OpenGL有自己的像素格式,只有OpenGL的客户区才能接受OpenGL绘制,因此在函数BOOL CMedicalView::PreCreateWin? dow(CREATESTRUCT& cs)中应有语句

cs.style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;

4)任何一个Windows程序都必须处理设备描述表(Device Context),OpenGL应用程序也必须应用DC。不过,将其称为着色描述表(Rendering Context)。着色描述表(RC)保存了与系统发生联系的重要信息。一个应用程序必须有一个着色描述表。生成和处理当前RC的过程是:设置窗口像素格式;生成RC;处理当前RC。

利用函数BOOL bSetupPixelFormat(),在其中定义OpenGL像素格式PIXELFORMATDESCRIPTOR的所有信息,然后在函数Init()中对DC所支持的像素格式进行测试,得到最接近系统的格式,创建并当前化着色描述表。当结束运行时,利用函数void CMedi? calView::OnDestroy(),设置当前线程的RC为NULL,(用语句::wglMakeCurrent(NULL, NULL);实现),断开当前线程和该渲染上下文的联系,由此断开与DC的联系。

5)当建立、移动、改变大小的一些事件发生时,都需要重新绘制场景,使用ClassWizard添加Windows消息WM_SIZE,并编辑其消息响应函数void CMedicalView::OnSize(UINT nType, int cx, int cy),添加以下语句:

建立视点、启动透视变换及建立透视体。

本文采用平行投影,因为平行投影不会因为物体的远近而改变大小尺寸,这就便于观察物体各部分的比例关系。

6)在函数Init()中追加以下语句:

{

……

glClearDepth(1.0f);//清除深度缓存

glEnable(GL_DEPTH_TEST);//启动深度测试

//启动OpenGL模型变换

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

……

//创建显示列表

glNewList(1,GL_COMPILE);

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,awhite);

Pentahedron();

Box(0.9f,0.6f,0.6f);

glEndList();

……

}

OpenGL显示列表是一系列OpenGL命令的高速缓存,不必进行内存管理,降低时间开销。显示列表驻留于服务器,因而减少了网络传输量,大大提高网络性能。显示列表中所用函数的参数值都是当前的,不会受今后变化的影响;封装在显示列表中的变换操作会对后继绘图产生影响;显示列表不可对其进行外部干预;显示列表需要精心管理。

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存

glClearColor(1.0f,0.8f,0.5f,1.0f);//设置清除颜色即背景色

glClearDepth(1.0f);//清除深度缓存

glEnable(GL_DEPTH_TEST);//启动深度测试

glDepthFunc(GL_LESS);//确定测试条件

……

glPushMatrix();

glTranslatef(0.45f,0.55f,0.0f);//平移变换

glRotatef(angle,0.0f,0.0f,1.0f);//旋转变换

glTranslatef(-0.45f,-0.55f,0.0f);//平移变换

glCallList(1);//调用显示列表

glPushMatrix();

……

glCallList(2);

glPopMatrix();

glPopMatrix();

glFlush();//强制绘图完成

if(doubleBuffer)

{

SwapBuffers(wglGetCurrentDC());//采用双缓存

}}

局部坐标是相对于物体而言的,其坐标原点往往是物体的形心,并且随着物体的移动而移动。在程序中要让物体1绕着一端旋转,如程序所示先平移,后旋转,再平移。平移的距离为物体形心到一端的距离,且前后数值相反。物体旋转时遵循右手规则,角度应以度数的方式来提供。物体2为物体1的子物体,物体1的运动直接影响物体2,但物体2可以有自己的独立运动,不会影响物体1。

8)创建工作线程,添加线程函数UINT MyWorkThread(LPVOID mParam)

{

……

Init();//调用函数Init()

……

while(1)

{

Drawscene();//调用函数Drawscene()

}

return 0;

}

需要特别指出的是创建显示列表必须在Init()函数中完成,因为如果在Drawscene()函数中创建显示列表,随着循环的不断进行,逐渐增加内存的占有量,进而导致内存资源耗尽而死机。

9)添加仿真函数void CMedicalView::OnAnimation()

{

……

m_pdemo=AfxBeginThread(MyWorkThread,&m_ctlpicture,

THREAD_PRIORITY_BELOW_NORMAL, 0, CREATE_SUSPENDED);

m_pdemo->m_bAutoDelete=FALSE;

m_pdemo->ResumeThread();

}

因为采用系统定时器有很多弊端,所以本文采用多线程技术。

2.2 Linux下的编程实现

Linux系统下的OpenGL程序通常是以QT为开发工具。(篇幅所限,程序略)

1)在glMedical.h文件的首部需要添加以下几个头文件:

#include ;

#include ;

2)对glMedical.cpp文件操作如下:

(1)在函数void GLMedical::initializeGL()中完成场景的初始化,并创建显示列表。

(2)在函数void GLMedical::resizeGL( int w, int h )中建立视点、启动透视变换及建立透视体。(3)在函数void GLMedical::paintGL()中调用显示列表等。

(4)在函数void GLMedical::animation()中调用线程函数,完成动画显示等。

3实时仿真

本文开发的三维多功能腰椎治疗仪主要有四种运动方式:牵引、倾斜、旋转、臀摆。主要治疗腰椎间盘突出症等疾病。治疗仪的运动参数作为实时动态输入传递给仿真系统以实现实时动态仿真。仿真样图如图2所示。

图2仿真样图

传统的慢性牵引为水平位,靠一定的时间和低于体重的力就可拉开椎间隙0.5-1.5mm,而该系统的牵引力高达3000N(约300Kg),特别是在快速和旋转作用下似乎很容易造成腰部组织损伤。然而正常腰椎可以承受至少400公斤的拉力。充足的牵引力才能保证瞬间快速有效的牵引治疗,这是该系统治疗原理上的重要特点和与传统慢牵的不同点之一。如果考虑病人在肌肉放松条件下的正常伸展力和固定带在皮肤上滑动消耗,该系统的牵引力(约300Kg)并不过大,如果机器稳定,选好适应症,让病人肌肉放松,给予合理的治疗参数,是很安全的。

腰椎间盘突出症有其自身发生发展的普遍规律。可分为弹力型、退变失稳型和增生狭窄型。临床观察发现,通过治疗参数的合理选择,该牵引床对腰椎间盘突出症特别是弹力型和退变失稳型具有良好的治疗作用。

4结论

本文基于Mesa/OpenGL,分别在Windows和Linux平台下实现了三维多功能腰椎治疗仪的动态实时仿真。由于在Windows和Linux下的开发工具不一样,导致了Mesa/OpenGL编程实现的差异,但是一旦掌握了这些不同点,只需对Windows下的OpenGL程序作少许改动即可用于Linux平台。另外,还应注意编程中的细节问题,如光照、变换和多线程等。

参考文献:

[1] OpenGL官方网站[EB/OL]. www.省略/

[2] Dave Shreiner,Khronos OpenGL ARB Working Group.OpenGL编程指南[M].7版.李军,徐波,译.北京:机械工业出版社,2010.

[3] Donald D,Hearn M.Pauline Baker.计算机图形学[M].3版.蔡士杰,宋继强,蔡敏,译.北京:电子工业出版社,2010.

[4] Mesa3D官方网站[EB/OL].www.省略/

上一篇:分布式发电微网保护解决方案 下一篇:基于应用型人才培养的DSP技术课程教学改革与实...