实时显示控制论文(精选7篇)
实时显示控制论文 篇1
1概述
温度控制系统应用于人们生产生活及工业生产中, 随着液晶显示技术的不断发展, 液晶显示器在温度控制系统中的应用越来越广泛。本文以字符型液晶显示器LCD1602和图形型液晶显示器LCD12864为例, 设计了一个液晶显示实时温度控制系统, 以LCD1602显示当前时间值及温度值, LCD12864能够自动绘出实时温度曲线。并且该系统的声光报警模块可针对不同的情形, 做出不同的报警处理, 这样可以使工作人员能及时准确地判断出该系统测量的温度高低。
2系统硬件设计
2.1系统总体设计。系统主要采用单片机AT89C51、 实时时钟芯片DS1302、温度传感器DS18B20、声光报警模块、字符型液晶显示器和图形型液晶显示器等组成一个单片机控制系统。当温度传感器采集到的温度变化时, 字符型液晶显示器能够显示当前时间值及温度值, 图形型液晶显示器能够自动绘出实时温度曲线。液晶显示实时温度控制系统总体设计图如图1所示。
2.2 DS18B20温度传感器。系统的温度采集使用的是美国DAL- LAS半导体公司的温度传感器DS18B20, 可直接将温度转化为串行数字信号供处理器处理。
2.3声光报警模块。选用3个普通的LED灯显示系统工作状态, 选用普通PNP型三极管驱动直流蜂鸣器作为声报警。当测量温度为± 30℃范围内, 只具有正常的“绿灯”亮;当测量温度高于30℃时, 就会发出报警声和“红灯”闪亮;当测量温度低于- 30℃时, 就会发出报警时和 “黄灯”闪亮。
2.4实时时钟芯片DS1302。实时时钟芯片DS1302, 它可以对年、 月、日、周、时、分、秒进行计时。DS1302可以用于数据记录, 特别是对某些具有特殊的数据点的记录。这种记录对长时间连续测控系统结果的分析及对异常数据出现的原因查找具有重要意义。
2.5液晶显示器。LCD1602主要调用CGROM中自带的字符来显示, 系统要求LCD1602显示当前时间值及温度值, 温度值精确到0.1℃。LCD12864可以通过编程控制显示任何想要显示的内容, 包括字符、汉字和图像, 系统要求LCD12864能自动绘出实时温度曲线。
2.6系统电路原理图。经过上述分析, 整个系统电路原理图如图2所示。
3系统软件设计
系统由主程序调用各子程序模块来完成系统功能。系统程序包括主程序、液晶显示子程序、温度数据读写子程序等, 均采用高级语言C语言进行编写。
主程序设计。上电后, 首先对系统进行初始化, 包括温度传感器初始化、实时时钟初始化、液晶显示器初始化。初始化完成后, 启动温度采集, 由单片机控制LCD1602和LCD12864分别显示当前时间值及温度值和绘制实时温度曲线, 对测量的温度值进行超限判断, 若高于或低于系统设置的温度值, 系统就会发出相应的报警。系统主程序流程图如图3所示。
4系统仿真
在Keil中编写系统程序并编译为“*.hex”文件, 在Proteus里将此文件烧录到单片机中, 这样就可以进行Proteus仿真了。温度值在±30℃ 范围内的仿真图如图4所示。
结束语
系统以单片机AT89C51为核心, 实现单片机与传感器、时钟芯片、 液晶显示器连接, 最终实现温度的采集与实时显示。将两种液晶显示器应用到温度控制系统中, 突出了液晶显示器在字符、文字、图片及实时数据显示和绘图方面的功能。通过Proteus仿真, 验证了系统设计的正确性和可实现性, 系统设计具体较强的可移植性。
摘要:设计了一个基于单片机的液晶显示实时温度控制系统, 系统硬件由AT89C51单片机、实时时钟芯片DS1302、温度传感器DS18B20、声光报警模块、字符型液晶显示器LCD1602和图形型液晶显示器LCD12864构成。该系统具有声光报警功能, 同时能够显示当前时间值及温度值并绘出实时温度曲线。分别在Keil和Proteus环境下设计了系统程序和系统电路原理图, 并在Proteus中进行了仿真, 完成了系统功能, 实现了各项技术指标。
关键词:温度控制系统,单片机,DS1302,液晶显示器
参考文献
[1]李壮辉, 朱清慧, 任拥伟.液晶显示应用控制系统设计与实现[J].液晶与显示, 2013, 28 (6) :889-894.
[2]朱清慧.Proteus显示控制系统设计与实例[M].北京:清华大学出版社, 2011.
[3]郭天祥.51单片机C语言教程[M].北京:电子工业出版社, 2009.
实时显示控制论文 篇2
当前现实生活中,LED显示屏在城市亮化、广告、信息发布等方面的应用有目共睹,已然成为城市中一道亮丽的风景。LED显示屏的物理尺寸形状多样,都是由各种尺寸单元板级联构成,随着技术的发展和应用需求,如何实时控制超长LED显示屏成为一个越来越引起注目的研究课题。对超长LED显示屏的实时控制要解决两个问题:一是提高LED显示屏单元板上串行移位脉冲速度;二是在修改数据时不影响显示屏正常显示。控制系统的通常做法是采用ARM+FPGA+大容量并行RAM电路结构,同时将并行RAM的读信号作为LED显示屏单元板上串行移位寄存器的串行移位脉冲。并行RAM基本结构是“地址线+数据线+读/写信号+片选”,想要达到移位一次显示数据需要并行RAM:地址加1和读显示数据。存储器RAM内保存的是显示数据,既要写入修改数据,又要不断地读出数据至LED显示屏,这2个操作非常频繁并且不能同时操作。解决这个矛盾的传统做法是在行数据输出间隔时间内预留一部分时间用于修改显示数据,这样势必会影响驱动LED显示屏的长度。基于SPI接口的串行RAM的操作时序,可以方便地将上述两个步骤合为一个步骤,提高了显示数据的输出速度,增加了驱动LED显示屏的长度。同时,串行RAM引脚少,电路布线少,降低了系统设计的复杂性,简化了双RAM设计的难度。
23LC1024是Microchip(美国微芯科技公司)2012年8月推出的串行SRAM芯片,该芯片通过4路SPI(SQI)协议可实现高达80 Mb/s的读/写速度,足以满足LED显示屏数据移位时钟的需要。本文在研究分析该芯片特点的基础上,提出一种显示数据以DMA方式高速输出、同步刷新及异步修改的超长LED显示屏控制系统。下面分几步对该控制系统的设计理念、电路设计及实测结果进行介绍。
1 串行SRAM芯片23LC1024工作时序
23LC1024芯片有8个引脚,引脚定义见图1。
通过设置可以使该芯片工作于传统的SPI模式、SDI(双SPI)模式或SQI(4路SPI)模式。图2为23LC1024工作于SQI模式的单字节读/写时序,读/写时序表明:除了命令字和读操作时有两个空周期不同外,所有读/写操作均在主机SCK脉冲驱动下完成。23LC1024的数据输入(写)发生在主机SCK时钟上升沿,而数据的输出(读)发生在主机SCK时钟的下降沿。
图3为23LC1024连续多字节读/写时序,其中C1,C0分别为命令字高、低半个字节,例如:读命令字0x03其C1=0x0,C0=0x3。24位地址A5~A0、数据H0,L0均对应8位字节的高、低半个字节(4位)。23LC1024串行RAM的SQI字节读/写时序看似烦琐,但却解决了一个根本问题:在片选、命令字、读/写地址给定的条件下,每送一个SCK脉冲完成一次半字节(4位)数据读/写,如果2片23LC1024“并联”使用,可等效8位并行RAM的读/写,4片、8片“并联”使用可等效16,32位并行RAM的读/写。对“并联”后的23LC1024读/写只需一个步骤,就是主机输出一个SCK脉冲。当输出数据的长度达到(LED显示的水平方向点数)1 024,2 048,4 096或更长时,前面送命令、地址所花的时间均可忽略不计。如果输出数据的SCK脉冲由ARM芯片的SPI_SCK采用DMA信号产生,其显示数据的平均输出速率快且不占用CPU处理时间,这正是本文超长LED显示屏控制系统的设计理念。
2 控制系统硬件电路
在对超长屏实时控制时,由于保存在RAM中的显示数据不断送至LED显示屏,RAM被长时间占用,留给CPU修改RAM数据的时间不足。本文提出双RAM系统,RAM1与MCU连接,在显示数据不修改的情况下,RAM2保存有和RAM1一致的数据,采用DMA方式将RAM2的显示数据送至LED显示屏。在显示内容变化时,修改RAM1中的数据,然后将RAM1的数据送至LED显示屏,同时也数据同步备份至RAM2。根据这个思路,控制系统硬件电路有两组RAM、用于切换的逻辑转换电路和驱动电路,电路如图4所示。
将U1和U3拼成8位的串行RAM1,U2和U4拼成8位的串行RAM2。通过对RAM1,RAM2,U5,U6引脚的逻辑控制,控制系统可以使RAM1和RAM2处在不同状态,达到预设的功能。
当U5关断时,RAM1,RAM2的数据口和控制引脚完全隔离,没有冲突,MCU可以单独对RAM1和RAM2进行读/写操作,如图5(a)所示。
当U5,U6关断,CPU可以读/写RAM1,RAM2,通过08接口和LED显示屏相连,如图5(b)所示。当U5选通,U6关断时,RAM1和RAM2相互连接,可以进行数据交换,如图5(c)所示。当U5选通,U6关断时,控制08接口的RCK信号和RAM1和RAM2的读/写信号,可以将RAM1的数据同时送至RAM2和LED显示屏,如图5(d)所示。在显示屏不修改的情况下,每行数据的处理流程是先按图5(a)模式分别设置RAM1和RAM2的地址,然后按图5(b)所示输出显示数据。由于RAM2至LED显示屏的数据是采用DMA方式输出,不需要占用CPU,所以CPU的主要任务是修改RAM1中的显示数据。RAM2显示完一串数据后,如果RAM1中的显示数据有修改,则需要按图5(d)输出显示数据,在行数据输出时,也是先设置RAM1和RAM2的地址,再读RAM1,将数据输出至LED显示屏和RAM2,行数据输出时序如图6所示。
一串数据结束后,再切换到图5(b)模式工作,直至新的修改内容出现。
3 应用实例及测试结果
由于教学科研需要建一个以Φ3.75,1 16扫描3 712×256双色LED实时控制显示屏,LED显示屏体采用464块64×32双色单元板级联,主要用于表示各种设备的运行状态。图7为其电路原理框图。
该系统核心采用1片LQFP144脚的ARM芯片STM23F103ZE,使用PF0~15、PG0~15两个16位端口(4个8位口)作RAM1的命令、地址及数据口,用PE0~7口给RAM2旁路送命令字和地址,用PD口的I/O做片选、时钟及245选通控制线,DMA时钟由PA5(SPI1_SCK)提供。08接口的245驱动、通信及FLASH存储部分鉴于篇幅限制省略。通过分析图7应用实例电路可以得到以下几点结论:
(1)使用SQI串行RAM,使连续顺序输出数据的速度大幅提高。
(2)最大限度地降低CPU在输送数据中所占用的时间,CPU主要用于数据接收和修改。
(3)SQI串行RAM命令、地址及数据复用4条I/O线,使占用CPU的I/O口数量减少。
(4)当LED显示屏垂直方向扩展时只需增加数据口和模块数量,系统扩展非常方便。
(5)该控制系统更新速度快,特别适用于实时控制的LED显示屏。
(6)与并行RAM相比,随机访问时需要拼凑命令字、地址及数据,读/写速度较慢。
硬件控制系统经两次改进已经定型,在调试过程中发现系统软件也有很多地方可以优化。例如在如图7时序刷新时RAM1,RAM2除读/写控制字低4位和空操作不同外,其余部分完全一致,所以图7时序可改进为读/写控制字低4位和空周期RAM1,RAM2异步操作,其余部分RAM1,RAM2同步操作。除DMA传输外,RAM1,RAM2送读/写控制字、地址及空操作部分所占用的时间为7.27μs,对于1 000μs的行扫描时间可以忽略不计,实验发现最后的输出速度主要是受LED单元板最大速度的限制,一般至少要将ARM的SPI_SCK时钟4分频后才可正常显示。所以本控制系统在1 16扫描的情况下,输出的屏长理论上可达到16 384点,屏的高度只会影响数据修改的速度,没有多大关系。
经测试后,显示屏显示正常,没有抖动情况,使用逻辑分析仪测试其刷新率,如图8(a)所示,信号A的电平宽度代表显示一行所需要的时间,其宽度为1.000 11 ms,显示一帧的时间为16×1.000 11 ms=16 ms,所以LED显示屏的刷新率为1 16 ms=62.5 Hz,满足正常显示要求。分析一行数据输出的SCK信号,如图8(b)所示,信号前序部分为RAM1、RAM2送读/写控制字、地址及空操作部分,所占用的时间为7.27μs,后续部分为3 712个SCK周期信号,所用时间为412μs,SCK电平变换时间仅为55 ns。根据SCK时钟输出速度,8 192个SCK周期的时间为8 192×55×2 ns=0.911 ms,该时间小于1行所需时间宽度;因此,控制卡控制LED显示屏的长度可以达到8 192点。
4 结语
实时飞行仿真显示系统设计 篇3
随着技术的发展,仿真技术的应用在扩大。采用实物进行飞行实时测试需要多台元器件共同完成,且维护、扩展、操作、运输极不方便。通过飞行中的数据,直观地再现飞行状态。因此实时飞行仿真显示系统适用于研究开发、方案论证和设计阶段。本系统采用在工程应用领域内连续系统仿真的数学仿真方法,并模拟生成人的感觉环境的各种物理效应设备(包括视觉、动感等人能感知物理环境的模拟生成、显示系统)。为了适应在数字计算机上进行数学仿真,按变量(包括按时间)进行离散化处理,以及根据精度与计算速率要求选用适当算法,将原始数据模型变换为仿真数学模拟[1]。
实时飞行仿真显示系统具有仿真操纵系统、清晰的仿真显示画面、逼真度高的飞行动力学特性、连续的性能仿真、良好的人机交互界面,具有动态感和交互性的环境仿真。通过建立数学模拟、利用先进的虚拟和计算机仿真技术,仿真再现飞行显示系统画面,可以通过设置各种飞行参数和条件实施飞行模拟操作,可以通过CRT、打印机、绘图仪显示输出仿真结果。采用实时飞行仿真显示系统可以实时运行,也可以在非实时条件下运行。
1 实时飞行仿真显示系统设计方案
本系统采用分布式交互协同工作,以模块化的建模方法,仿真飞行显示系统画面。实时飞行仿真显示系统大体由数据采集处理中心模块、子系统模拟器模块、仿真显示器模块、飞行控制台模块组成,结构如图1所示。
子系统模拟器在网络终端提供各种飞行实时数据,它是通过键盘指令或文件的数据源,向数据采集处理中心提供所需数据;数据采集处理中心负责控制网络中的数据源,并且利用子系统模拟器的数据源,加载飞机运动方程,转化为飞行状态数据,向仿真显示器提供飞行数据;仿真显示器除了显示飞行数据及画面,还提供外部环境画面。子系统模拟器和显示系统模块在网络中通过点到点的方式连接到数据采集处理中心上,由该数据采集处理中心向目的终端传送信息。数据采集处理中心执行集中式通信控制策略,在此网络结构中任何两个终端要进行通信都必须经过数据采集处理中心。
由飞行控制台传来的操纵控制指令提供飞行输入数据,在飞行控制模块中,根据操纵指令和控制规律计算飞行状态,由起落架力和力矩模块负责计算飞机起飞和降落时在地面运动的力和相应的力矩,气动力/力矩模块计算气动系数和气动力/力矩;飞机六自由度运动方程模块解算飞机六自由度非线性全量运动方程,计算出姿态、位置、加速度和角速度等飞行状态信息,并将飞行状态信息在反馈给气动系数模块、起落架力和力矩模块,同时输出到实时飞行仿真显示系统的其他子系统。飞行仿真的主要功能是对飞行控制系统的输入作出反应,对飞机飞行状态进行仿真[2];解算飞机的六自由度非线性运动方程;并对环境变化、飞机本身的变化和飞行造成的影响进行仿真解算。
在Windows环境下,采用C++ Builder和OpenGL作为编程工具,运用面向对象的设计方法,开发实时飞行仿真显示系统。该系统按指定机种提供的真实图形仿真飞行画面,数据采集处理中心负责把画面显示数据存放在显示数据存储器中;仿真显示器负责从显示数据存储器中读取数据;仿真显示器定时调度数据画面,并对所有显示符号、线段、数字的静态及动态象素坐标进行实时计算,生成仿真飞行画面[3];仿真显示器实时接收解算数据采集处理中心所得数据,并将其作为仿真显示器的驱动数据,为充分保证飞行状态的准确性和连续性,对数据进行精度提取和高速插值计算。同时,采用融合消隐技术和抗锯齿算法解决飞行画面中抖动和旋转时出现的锯齿问题。
数据传输系统采用基于UDP传输协议的Socket编程技术,结合数据压缩和调度算法,解决网络编程时数据安全可靠传输的技术难题。为了提高数据传输的稳定性和实时性,数据采集处理中心同时开设多个端口,一些端口用于发送飞机的飞行数据,一些端口分别实时接收其他子系统模拟器发送的飞行数据,并用其作为仿真飞行显示的驱动数据。
实时飞行仿真显示系统的网络结构,体积小、耗费低,便于管理、维护、调试;控制简单,建网容易。通过构建飞行动力学模型,实现飞机的俯仰、滚转、偏航等飞行姿态的模拟,模拟逼真,实时性强。OpenGL 3D声音引擎仿真飞行过程中听到的主要环境音效和实现语音提示功能,OpenGL具有表现多通道三维位置音效的能力,主要是在来源物体、音效缓冲和收听者中编码。来源物体包含一个指向缓冲区的指标、声音的速度、位置和方向,以及声音的强度。通过采用OpenGL纹理控制,基于glut核心函数库编程、视点控制处理、数据传输,自主开发场景画面,实时动态渲染,运行效率高,场景模拟真实感强,实现了实时飞行仿真显示系统图形图像显示。
2 实时飞行仿真显示系统软件功能结构
数据采集处理中心有一个主线程和多个子线程。主线程负责终端的接入连接请求,然后创建一个子线程来处理这个终端网络连接。每个子线程按照既定的协议与数据采集处理中心通讯。在网络通讯中,当其中一个终端正在向数据采集处理中心发送数据块时,其它某个终端正在向数据采集处理中心请求这个数据块时,数据采集处理中心采用互斥的方法,将完全接收完整个数据块,然后才向请求的终端发送完整的数据块。终端向数据采集处理中心发送数据,数据采集处理中心保存这些数据,终端也可以向数据采集处理中心请求数据。所以每个终端有可能是很多数据的发送者或请求者。在同一时间内,飞行实时图形仿真系统可能有多个数据的发送和请求终端存在,数据的读写速度成为数据采集处理中心的重要性能指标。数据采集处理中心的采用消息列表的方式,提高数据的读取处理,为数据的可靠性提供保障[4]。
网络通讯采用MIL-STD-1553B 总线通讯规则[5],该标准确定了美国军用飞机数字式数据总线的各种要求。网络数据消息块包含有指令字、状态字、数据字。并相应设计了10种消息格式,即“信息传输格式”。在此系统设计中,增加了消息的生存时间字,用于记录消息的生存时间,判定消息是否应该驻留在系统中,还是该删除。当要求通信的终端发出通信请求后,数据采集处理中心查看被叫终端是否空闲,是否建立通路响应,从而决定是否能建立双方的物理连接。终端向数据采集处理中心请求数据时,先向数据采集处理中心询问数据是否存在,数据采集处理中心收到请求数据命令,在消息列表查询,如果请求的数据不存在,数据采集处理中心向请求数据的终端发送“失败”消息。如果请求的数据存在,数据采集处理中心向请求数据的终端发送“成功”消息,然后向请求的终端发送请求的数据。数据采集处理中心同时也处理从各个终端接收到的数据,向子系统模拟器模块、显示系统模块发送相应数据,仿真显示器从正视、后视、左视、右视等角度直观反映飞行状态。数据采集处理中心数据包格式如表1所示。
子系统模拟器提供实时飞行仿真显示系统必须的飞行用数据,其数据源读入有两种方式:一种为人工设置(分为静态和动态数据),另一种为原始飞行数据文件(文件流fstream读入飞行数据文件)。实时飞行仿真系统一般运动动力学方程组为:
Fx,Fy,Fz;u,v,w;p,q,r为作用在飞机上的所有外力的和F,飞机的质心速度v,质心转动的角速度w在机体坐标系三个坐标轴Ox,Oy,Oz上的分量;Ix,Iy,Iz为转动惯量。
动力学方程组为力和力矩方程,利用坐标转换关系计算飞机相对于地面固定坐标系的方程和飞行轨迹运动学方程如下:
θ----俯仰角
ϕ----滚转角
仿真显示器需要使用一种计算能力很强的计算机语言对其数据进行处理,仿真显示飞行画面。OpenGL提供了数百个库函数,可以方便地绘制具有真实感的3D图形。图形的绘制只是一部分工作,更多的工作集中在场景数据结构、图形对象、三维交互和图形用户界面的设计上[6]。OpenGL与窗口系统无关,不提供任何交互手段,必须由程序员自己编写所有的交互功能。它的大部分指令是立即接口操作方式,说明对象可以马上进行硬件操作[7]。本系统在仿真显示器图形设计时,定义了视场局部坐标系以及相应的图形变换。采用最小单元法,其中基础对象定义了矢量、矩阵运算;常用几何图元的绘制(线、圆、刻度带等),图形函数将数据转化为几何模型绘制出来,使用继承方法扩充新的几何图元;点阵中文字体用于可视化图形的标注。该系统设计中汉字的形状复杂多变,所以显示汉字较难,采用汉字显示中的线性列表方法,先由CreateFontIndirect函数创建需要的中文字体、然后判断每一个字符是否为双字节,如果是就多处理一个字节,创建中文显示列表、运用投影矩阵和模型变换矩阵显示需要的文字。
实时飞行仿真显示系统显示画面具有固定的视场范围[8],根据显示器画面的视场范围,计算实时飞行仿真显示系统的仿真显示器像素换算比例K,用以确定元素在仿真显示器中的位置。
环境、动画场景的实时处理,是将图像存储在帧缓存中,帧缓存是多个显示缓存的逻辑集合,通过双缓存技术完成环境、动画场景的实时显示。环境形态的变化、位置的变化以及颜色的变化通过网络数据及程序的定时器控制。图形显示工作流程如图3所示。
C++ Builder具有快速的可视化开发环境,内置了100多个完全封装了Windows公用特性且具有完全可扩展性的可重用控件[9]。利用相关控件组建外部接口模块、操作模块。外部接口主要完成人机界面的设计,为使用者提供有好方便的操作平台。
图形创建首先检索指定窗口的客户区域环境的句柄Picture_hdc=GetDC(PanePicture->Handle);再创建一个新的OpenGL渲染描述表,此描述表适用于绘制到由Picture_hdc返回的设备,这个渲染描述表将有和设备上下文一样的像素格式Picture_hrc=WglCreateContext(Picture_hdc);然后设定OpenGL当前线程(线程相关性)的渲染环境,以后这个线程所有的OpenGL调用都是在这个Picture_hdc标识的设备上绘制wglMakeCurrent(Picture_hdc,Picture_hrc)。
仿真显示器画面坐标系根据国家标准规定的坐标轴系定义,实时飞行仿真显示系统画面的生成采用光栅扫描法。与真实飞行显示系统相比,某检测画面如下:图4为某一真实显示器的画面,图5为仿真显示器的画面。经检测证明:实时飞行仿真显示系统能满足飞行模拟使用,数据显示准确,画面清晰、正确,适合飞行仿真试验研究。
3 结 语
本文介绍了采用虚拟仪器技术研制实时飞行仿真显示系统,提出了软件实现实时飞行仿真显示系统的设计方法,从而有效地提高了飞行器研究开发、方案论证和设计方法。由于实时飞行仿真显示系统软件的易操作、易维护,更好地弥补了硬件带来的缺陷。
参考文献
[1]卢惠民.飞行仿真数学建模与实践[M].北京:航空工业出版社,2007.
[2]张刘,金光,郑亮亮.飞行姿态模拟器建模及输入受限混杂控制[J].光学精密工程,2009,17(7):1561-1569.
[3]夏拥军.工程飞行模拟器的仿真平显[J].测控技术,1996,15(2):38-39.
[4]贾容珍,林胜,王行任.飞行模拟器数据预处理及函数生成[J].测控技术,1996,15(6):54-56.
[5]宾辰忠,苗克坚.基于1553B总线的实时消息流实现与控制[J].计算机测量与控制,2005,13(9):967-969.
[6]卞泳锋,张兴周,韩亮.基于OpenGL的空战三维可视化仿真系统[J].应用科技,2007,34(11):46-50.
[7]郭兆荣,李菁,王彦.Visual C++OpenGL应用程序开发[M].北京:人民邮电出版社,2006.
[8]李娟,边信黔,夏国清,等.舰载机飞行仿真可视化研究[J].计算机仿真,2008,25(2):294-298.
实时显示控制论文 篇4
全球领先的测试、测量和监测仪器提供商——泰克公司日前宣布,推出SA2600新型手持式实时频谱分析仪,其采用了DPXTM波形图像处理技术,可提供频谱的实时RF视图。泰克此前于2月份推出的H600 RF猎鹰便携式无线信号侦测仪现在也提供DPX技术。通过这些新增仪器,泰克提供了采用DPX技术的全系列实时频谱分析仪,可以广泛用于现场测试和设计平台中。
SA2600提供了10kHz-6.2GHz的频率范围、20MHz实时带宽和-153dBm显示平均噪声电平(DANL),在电池供电的手持式现场测试仪器中设计提供了台式频谱分析仪的性能。由于频谱处理速率要比其他厂商提供的任何扫频分析仪快100倍以上,SA2600和H600为瞬态事件提供了100%的侦听概率,SA2600可以侦听最短事件时间周期为500μs的瞬态事件,H600可以侦听最短事件时间周期为125μs的瞬态事件。
SA2600和H600是为现场测量设计的。新型号把高性能频谱分析仪与一套直观的用户控制功能结合在一起,可以迅速简单地分类和定位模拟与数字RF传输。用户界面采用专门设计,增强了现场测试的工作效率,其中包括一个触摸屏,可以轻松进行导航。相比其他解决方案可能要求附加离线GPS和地图软件的情形,SA2600/H600已集成GPS和地图工具,提供了更加高效的干扰定位功能。
基于面向对象的图像实时显示设计 篇5
本设计的应用程序是采用面向对象技术,在Microsoft Visual C++6.0下开发完成的。Visual C++就是一个典型的面向对象的编程语言。而在Windows的界面设计和软件开发环境中,也可以说处处贯穿着面向对象的思想。
在Windows中,程序的基本单位不是过程和函数,而是窗口。一个窗口是一组数据的集合和处理这些数据的方法和窗口函数。从面向对象的角度来看,窗口本身就是一个对象。Windows程序的执行过程本身就是窗口和其他对象的创建、处理和消亡过程。Windows中的消息的发送可以理解为一个窗口对象向别的窗口对象请求对象的服务过程。因此,用面向对象方法来进行Windows程序的设计与开发是极其方便的和自然的。
1 多个线程的设计
在系统中,对数据的实时处理有着很高的要求,由于WINDOWS操作系统支持多任务调度和处理,基于该功能所提供的多任务空间,程序员可以完全控制应用程序中每一个片段的运行,从而编写高效率的应用程序。
多任务操作系统将处理器的运行时间分成小的时间段,并分配给多个线程,每个线程在操作系统规定的时间段内运行。当线程使用完分配的时间段后,线程暂停执行;操作系统再将下一个时间段分配给其它线程执行;操作系统不断地将一个线程执行切换到另一个线程,经过一定时间的运行后,多个线程就同时完成了任务。由于各线程运行的时间段非常短,大约是20 ms,所以多线程能很好地满足系统中实时多任务处理的要求。
当系统需要同时执行多个进程或多个线程时,有时会需要指定线程的优先级。线程的优先级一般是指这个线程的基优先级,即线程相对于本进程的相对优先级和包含此线程的进程的优先级的结合。操作系统以优先级为基础安排所有的活动线程,系统的每一个线程都被分配了一个优先级,优先级的范围从0到31。运行时,系统简单地给第一个优先级为31的线程分配CPU时间,在该线程的时间片结束后,系统给下一个优先级为31的线程分配CPU时间。当没有优先级为31的线程时,系统将开始给优先级为30的线程分配CPU时间,以此类推。除了程序员在程序中改变线程的优先级外,有时程序在执行过程中系统也会自动地动态改变线程的优先级,这是为了保证系统对终端用户的高度响应性。比如用户按了键盘上的某个键时,系统就会临时将处理WM_KEYDOWN消息的线程的优先级提高2到3。CPU按一个完整的时间片执行线程,当时间片执行完毕后,系统将该线程的优先级减1。
MFC类库提供了多线程编程支持,对于用户编程实现来说更加方便。非常重要的一点就是,在多窗口线程情况下,MFC直接提供了用户接口线程的设计。
MFC区分两种类型的线程:辅助线程(WorkerThread)和用户界面线程(UserInterfaceThread)。辅助线程没有消息机制,通常用来执行后台计算和维护任务。MFC为用户界面线程提供消息机制,用来处理用户的输入,响应用户产生的事件和消息。但对于Win32的API来说,这两种线程并没有区别,它只需要线程的启动地址以便启动线程执行任务。用户界面线程的一个典型应用就是类CWinApp,它是CWinThread类的派生类,应用程序的主线程是由它提供,并由它负责处理用户产生的事件和消息。类CwinThread是用户接口线程的基本类。CWinThread的对象用以维护特定线程的局部数据。因为处理线程局部数据依赖于类CWinThread,所以所有使用MFC的线程都必须由MFC来创建。
对于数据采集程序,可以用一个单独的线程进行数据采集。这样,能最大限度地保证采集的实时性;而另外的线程同时又能及时地响应用户的操作、进行数据和图像显示及数据的存储等功能。否则,程序在采集数据时就不能响应用户的操作;在响应用户操作时就不能进行数据采集。尤其当采集的数据量很大,数据处理任务很重时,如果不采用多线程,采集时漫长地等待是很难让人接受的。
所以在软件的设计过程中需要添加一个额外的线程来专门处理数据采集的问题,创建线程是通过下面的步骤实现的,分别时实现控制函数和启动线程,它 并不必须从CWinThread 派生一个类。
(1)实现控制函数。
控制函数定义该线程。当进入该函数,线程启动;退出时,线程终止。该控制函数声明如下:
UINT BulkReadThreadProc(LPVOID pParam)
(2)启动线程。
由函数AfxBeginThread创建并初始化一个CWinThread类的对象,启动并返回该线程的地址。则线程进入运行状态。
m_pBulkReadWorkerThread=AfxBeginThread(BulkReadThreadProc,
&m_bulkreadThreadInfo,
THREAD_PRIORITY_NORMAL);
但是,多线程要比普通程序设计复杂得多。由于任意时刻都可能有多个线程同时执行,所以,许多的变量、数据都可能会被其他线程所修改。所以编程时有一个非常重要的问题就是线程同步。所谓线程同步是指线程之间在相互通信时避免破坏各自数据的能力。同步问题是由前面说到的Win32系统的CPU时间片分配方式引起的。虽然在某一时刻,只有一个线程占用CPU(单CPU时)时间,但是没有办法知道在什么时候,在什么地方线程被打断,这样如何保证线程之间不破坏彼此的数据就显得格外重要。在MFC中,可以使用4个同步对象来保证多线程同时运行。它们分别是临界区对象(CCriticalSection)、互斥量对象(CMutex)、信号量对象(CSemaphore)和事件对象(CEvent)。在这些对象中,临界区对象使用起来最简单,它的缺点是只能同步同一个进程中的线程。另外,还有一种基本的方法,本文称为线性化方法,即在编程过程中对一定数据的写操作都在一个线程中完成。这样,由于同一线程中的代码总是按顺序执行的,就不可能出现同时改写数据的情况。
在程序设计的过程中,线程要向界面窗口报告状态,为了实现这个功能,采用的方法时是通过消息实现的,由于消息本身携带的消息量有时不够用,消息参数只是一个指向某消息对象的指针,而消息对象需要在堆内存中new生成(因为线程不能等待消息处理完毕就继续执行),界面接受到消息对象后delete之;但是这时界面退出后,如果线程仍然生成新的消息对象,则消息对象得不到释放,所以在这种情况下,界面接受到WM_CLOSE消息将要释放之前,要等待线程完全退出之后再真正释放。
2 图像的显示程序
图像的实时显示是利用DirectDraw实现的。DirectDraw是DirectX技术的核心,它可以直接操作显示内存,进行硬件位转换操作,硬件覆盖操作和页面切换操作。作为一种软件接口,DirectDraw在维护Windows GDI设备兼容性的基础上提供了对显示设备的直接访问。因此,DirectDraw并不是高级图形API,而是一种实现游戏和Windows子系统软件(如3D图形软件包)的设备无关方法。
DirectDraw所支持的硬件范围广泛,从简单的SVGA到高级硬件实现(裁剪、拉伸、非RGB颜色支持等)都完全支持。那些硬件没有实现的特征将由DirectX使用软件仿真。简略地说,DirectDraw使用了设备无关方法实现了对显示内存的设备相关访问。
DirectDraw应用程序往往能够获得超过标准Windows GDI应用程序,甚至MS-DOS应用程序的功能。DirectDraw通过COM接口提供服务。这些COM接口包括IDirectDraw,IDirectDraw2, IDirectDrawSurface, IDirectDrawPalette, IdirectDrawClipper等。DirectDraw的设备无关性是通过硬件抽象层(hardware abstraction layer, HAL )实现的。对于那些硬件没有实现的功能,则使用硬件仿真层(hardware emulation layer , HEL)实现。当应用程序调用DirectDraw时,它将根据硬件的能力决定是调用HAL功能还是HEL功能。HEL有时会调用GDI的一些功能,有时则会直接访问硬件以完成一些简单的并与具体硬件无关的任务,比如内存访问等。HAL和HEL联合使用可以提供一组可靠的与设备无关的特征,但是这种设备无关性还有一定的缺陷,而且在DirectDraw中表现得最明显。因此,与GDI不一样,DirectDraw不是完全与设备无关的,而只能算几乎与设备无关。如果通过分析宿主系统能力并作出相应的调整,可以使应用程序获得最佳的性能。
图像实时显示的实现流程如图1所示。
图像的实时显示的实现总共分为以下几步:
(1) 创建DirectDraw对象
要使用DirectDraw必须使用DirectDrawCreate来创建一个带有IDirectDraw接口的DirectDraw对象,以便用户可以通过它来访问其它DirectDraw功能。
(2) 设置协作级别
在调用DirectDraw其它方法之前必须先设置屏幕协作级别,否则它们中的某些方法会失败。协作级别用于控制应用程序和系统及其它应用程序之间的交互程度。
(3) 设置显示模式
DirectDraw的显示模式内容包括宽度、高度、格式和刷新频率。
DirectDraw提供了一套完整的用于管理显示模式的方法具体操作可以通过EnumDirplayModes方法列举当前可能的显示模式并可以用SetDisplayMode来改变模式。
(4) 创建DirectDraw主图面
主图面就是用户能够看到的当前界面,每个DirectDraw对象只有一个主图面。在DirectDraw启动之前,主图面就已经存在了,那就是GDI用于绘制Windows用户界面的图面。在创建指向它的DirectDraw图面对象之前,没有办法访问主图面。
(5) 创建off_screen图面
创建了主图面以后接着要创建off_screen 图面,off_screen 图面是不能直接被看见的。它主要是作为存储可视部件的存储缓冲区,这些缓冲区可用于组成主图面或切换图面。创建off_screen 图面的过程和创建主图面的过程基本上一致,唯一的区别在于off_screen 图面要提供更多一点的细节。
(6) 设置剪裁器
剪裁器可以将DirectDraw所能输出的范围限制在屏幕上的某个区域范围,范围之外的其它部分将被剪裁掉。DirectDraw提供了DirectDrawClipper类来实现剪裁功能。
(7) 视频显示
视频显示的工作主要将从采集处理板读进来的、连续不断的图像数据装入主画面。其方法是先将图像写入off_screen 图面,然后用位转换Blt 操作将off_screen 图面整体拷贝到主图面中。
3 实验调试结果
当系统的数据采用模拟码源的数据时,所获取的数据图像如图2和图3所示,模拟码源的数据都是已知的,而且是根据需要进行设定的
图2中用到的模拟码源是由0xFF到0x00的递减数据,即是从255到0的灰度图像,完成由黑到白的渐变。
在图3中,数据来源于三个通道,分别是0xFF—0x00,0xFF—0x00,0x00—0xFF,体现在图像的RGB值上是(255,255,0)到(0,0,255)的渐变图像,颜色用红色逐渐过渡到青色,由于黑白打印机的限制,打印后的图像可能看不到这种颜色的渐变,表现为灰度的形式。
摘要:选用VisualC++开发用户界面程序,采用面向对象的程序设计,提供了友好的操作界面;采用DirectDraw技术实时显示图像,减少了系统响应用户命令的时间,更好地满足了实时显示图像数据的要求。
实时显示控制论文 篇6
随着嵌入式设备的广泛应用,ARM体系结构的微处理器芯片已广泛应用于无线产品、PDA、GPS、网络及消费电子产品等各个领域。作为高性能、低功耗的RISC处理器芯片, ARM芯片在嵌入式设备和手持设备中应用占有的比例越来越高。目前S3C2440是应用最为广泛的嵌入式处理器,芯片上集成了丰富的常用外设接口,简化了便携式系统的设计。在S3C2440上能够集成各种主流嵌入式操作系统比如Linux、Windows CE,使ARM能够对自身丰富的内存外设资源进行有效的管理与分配,对响应的中断,DMA功能合理利用,实现复杂控制的功能和较为复杂的通信协议。
Windows CE 5.0是微软推出的32位嵌入式操作系统,该操作系统基于WIN32 API与Windows 95/98图形用户界面的嵌入式操作系统,具有模块化、结构化、图形界面化等特点。Windows CE是分层操作系统,其中内核层与应用程序层是与硬件配置无关的软件层,所以Windows CE对于不同的硬件平台多具有非常好的移植性,只要针对不同硬件平台开发相关的板级支持包(BSP)完成移植工作。
Camera Interface(简称CAMIF) 是专门为图像采集设计的接口,也是S3C2440唯一的高速外设接口。该模块支持ITU-R BT.601/656 YCbCr 8bit标准图像输入;最大支持 4096 × 4096 像素图像;共有两路独立DMA通道,P通道和C通道,对应于图像预览和静态图片的存储。两路DMA都可以对采集到的图像进行旋转和镜像操作,本文使用S3C2440作为Windows CE 5.0的硬件平台设计并实现CAMIF模块驱动,该驱动通过DMA方式将外部的图像数据ITU-R BT.656实时显示。
1 视频数据的实时接收
CAMIF是专门针对视频采集设计的高速IO接口,采集的数据具有输入数据量大,实时性高的特点。图像数据采集模块按照8比特并行向CAMIF模块传入ITU-R BT.601/656 YCbCr数据,传入的图像数据经过CAMIF模块处理以DMA的方式存储在事先分配好的S3C2440的SDRAM缓冲区中并将接收完的奇数和偶数场信号“拼成1帧图像”,再将该图像数据写入LCDCDMA实现图像的实时显示。
对于P通道,CAMIF模块DMA共有4个PINGPONG存储空间,每一个通道对应图像的一场数据,4个存储空间可以存储2帧图像,这样就保证了图像接受和显示的实时性。
2 CAMIF模块原理
2.1 CAMIF模块配置
2.1.1 配置ITU-R BT.656模式
CAMIF支持ITU-R BT.656 YCbCr 8bit标准图像输入,将S3C2440的GPIO设置为对应的CAMIF功能:图像数据接口CAMDATA0~CAMDATA7,时钟数据接口CAMPCLK。ITU-R BT.656时序如图1所示。
根据ITU-R BT.656协议,每行视频数据块的开始和结束分别包含定时基准信号SAV(Start Of Active Video)和EAV(End Of Active Video),每个定时基准字包括四个字组成:0xFF,0x00,0x00,0xXY。前三个字是固定前缀,最后一个字代表场、行消隐信息,根据S3C2440数据手册CAMIF模块可以捕获定时基准字来代替ITU-BT.601规范下的行、场同步信号。
2.1.2 初始化CAMIF模块
使能CAMIF模块时钟,根据S3C2440数据手册CAMIF使用AHB时钟,必须大于CAMPCLK。ITU-R BT.656标准输出时钟是27MHz,S3C2440的AHB总线时钟HCLK经过主时钟FCLK分频后达到100MHz,满足CAMIF时钟要求。
通过配置相关GPIO为CAMRESET功能,复位外部图像采集模块;配置模式为外部输入模式(共两种模式:外部输入,色棒模式),其中色棒模式是测试模式,由CAMIF内部产生图像信息;清除所有输入FIFO溢出标志位;使能ITU-R BT.656模式;根据ITU-R BT.656规范设置CAMPCLK极性。
2.2 CAMIF模块DMA配置
CAMIF通过DMA方式存储接收到的ITU-R BT.601/656 YCbCr格式数据,每场图像数据对应一个PINGPONG存储空间。
PINGPONG存储空间在SDRAM空间中分配出一个保留段,该段是独立于Windows CE内核和应用程序RAM段,大小由图像尺寸而定。例如分辨率是320×240,格式为16-bit RGB,不经过CAMIF任何剪裁,4个PINGPONG可以存储2帧图像,每个PINGPONG存储一场图像数据大小是75kB。
在生成Windows CE映像之前先在Platform Builder 5.0配置文件中声明该CAMIF驱动的DMA存储段,在OEM或应用层,通过API MmMapIOSpace或者VirtualAlloc 、VirtualCopy函数向内核申请并分配该段DMA存储空间返回一个指向该段存储空间的指针,或者通过API SetKMode函数在OEM层将用户模式切换为内核模式,再直接引用该段DMA对应的虚拟地址实现对该段DMA的访问。在修改完配置文件后还需重新生成Windows CE映像文件。
在CAMIF驱动中,根据图像尺寸计算每场数据的大小以及起始地址,将起始地址分别写入相应PINGPONG地址寄存器(CIPRCLRSA1~4)中,完成了对DMA存储空间的保留与配置。
经过调试,尽管CAMIF驱动只使用了P通道作为DMA传输通道,而且C通道和P通道是独立的,但是必须设置C通道的PINGPONG存储地址,如果没有设置C通道存储地址,无法产生奇(偶)场对应的中断事件,导致数据接收不成功。
2.3 CAMIF模块图像剪裁、缩放设置
2.3.1 图像剪裁
CAMIF图像剪切相关寄存器是CIWDOFST,图像剪裁原理如图2所示。
SourceHsize和SourceVsize是输入到CAMIF未剪裁的图像宽度和高度,通过设置WinHorOfst和WinVerOfst水平和垂直剪裁图像,剪裁后的宽度和高度分别如式(1)-(2)所示。
TargetHsize_xx=SourceHsize-2×WinHorOfst (1)
TargetVsize_xx=SourceVsize-2×WinHorOfst (2)
2.3.2 图像缩放
P通道缩放相关寄存器是CIPRSCPRERATIO,CIPRSCPREDST,CIPRSCCTRL,图像缩放原理如图3所示。
图像放大只是局部放大,必须得先对图像进行剪裁,再按照一定比例进行放大,并且需要保证放大后的图像尺寸不大于原始图像尺寸。需要用到图像剪裁中的WinHorOfst与WinVerOfst值剪裁出原始图像的一部分,在对该部分按照水平垂直比率分别为式(3)-(4)进行放大。
SourceHsize/SRC_Width (3)
SourceVsize/SRC_Vsize (4)
对于图像缩小,按照缩小后图像的尺寸DST_Width、DST_Height计算水平和垂直缩小比例,设置相关寄存器实现图像缩小,图像缩小后的数据量以及尺寸都会减小。
剪裁和缩放都是在CAMIF模块中进行的,由于S3C2440内部没有硬件乘法器,和其他专用的视频处理单元,难以进行实时的、复杂的图像处理操作,图像压缩等实时要求高的运算,一般需要DSP协处理器完成。
3 视频显示原理
在Windows CE下,显示驱动是分层驱动,该驱动分为MDD、PDD层。PDD层在OAL层实现,功能包括初始化LCD模块,设置LCDCDMA地址用于存储LCD像素点的DMA地址;MDD层使用基本图形引擎(GPE)类来实现,MDD层通过访问PDD层对硬件进行操作并且为内核提供DDI接口,内核使用DDI接口实现LCD显示。
S3C2440具有LCD外设接口,可以通过大多数TFT-LCD进行显示。S3C2440的LCD模块有专门的LCDCDMA通道,可以保证显示的实时性。
外部视频处理模块按照ITU-R BT.656规范输入YCbCr视频格式信号,再经过CAMIF模块的处理转为可以直接显示的16-bit RGB数据并通过DMA将16-bit RGB数据存储到事先开辟好的对应PINGPONG数据存储区。驱动将CAMIF模块DMA接收的视频数据通过LCDCDMA送到LCD上实时显示。
显示是在分辨率800×480,主显示模式16bpp的7寸TFT-LCD上完成的。实时显示分辨率320×240或640×480的ITU-R BT.656图像数据。
4 结束语
本文在Windows CE 5.0上编写了CAMIF驱动,实现了通过CAMIF模块对ITU-R BT.656格式图像数据进行剪裁、缩放,并通过DMA方式接受16-bit RGB数据,再将接受的数据通过LCDCDMA在LCD上实时显示。
由于S3C2440内部没有硬件乘法器,难以用于实时数据处理,但CAMIF作为S3C2440唯一的高速外设接口,可以与DSP进行通信,只要产生ITU-R BT.601/656 YCbCr格式的标准时序则DSP可以作为S3C2440的协处理器。
CAMIF驱动不足之处在于没有通过操作系统提供的图像接口显示数据,只是通过S3C2440的LCD模块DMA显示数据。今后的工作重点在于将SDRAM保存的视频数据通过微软提供的Windows CE支持的流媒体处理的开发包DirectShow实时播放。
摘要:通过Platform Builder定制支持Camera Interface模块P通道DMA的Windows CE 5.0系统。该系统适用于三星S3C2440平台,在S3C2440硬件平台上运行的Windows CE 5.0系统环境下,配置Camera Interface模块ITU-R BT656格式数据被剪裁和缩放并通过4个DMA通道实现实时视频数据的接收及“乒乓”数据缓存。并实现将数据缓冲区中图像数据在TFT-LCD上实时显示,最高分辨率可以达到640×480,实时显示速率达到22帧每秒。
关键词:Windows CE 5.0,剪裁,缩放,Camera接口,液晶模块DMA,ITU-RBT.656
参考文献
[1]何宗键.Windows CE嵌入式系统[M].北京:北京航空航天大学出版社,2006.
[2]吴明晖.基于ARM的嵌入式系统开发与应用[M].北京:人民邮电出版社,2004.
[3]王旭东,徐刚.基于Windows CE.Net 4.2嵌入式操作系统多媒体播放器的应用研究[J].微计算机信息,2006,22(17).
[4]刘大鹏,马孝江.基于Windows CE的嵌入式操作系统实时性分析[J].自动化技术与应用,2002(1).
[5]舒云.基于ARM平台上Windows CE操作系统的内核定制与应用研究[D].2007.
[6]闫国英,郭宝增,王芳.Windows CE.NET及其在嵌入式系统中的应用[J].微机发展,2005,15(1).
[7]Jeffrey Richter,王书洪.Windows高级编程指南[M].3版.北京:清华大学出版社,1999.
[8]马跃,刘瑞,吴文江.基于Windows CE.NET的数控系统实时性能测试与分析[J].小型微型计算机系统,2007,28(12).
[9]陈晓明,王治森,董伯麟,等.基于Windows CE 5.0的嵌入式数控系统实时性研究[J].工业仪表与自动化装置,2007(6).
[10]田东风.Windows CE应用程序设计[M].北京:机械工业出版社,2003.
实时显示控制论文 篇7
关键词:三维显示,OpenGL,数据可视
1 引言
数据可视化技术指的是运用计算机图形学和图像处理技术, 将数据换为图形或图像在屏幕上显示出来, 并进行交互处理的理论、方法和技术。它涉及到计算机图形学、图像处理、计算机辅助设计、计算机视觉及人机交互技术等多个领域。数据可视化概念首先来自科学计算可视化, 随着计算机技术的发展, 数据可视化概念已大大扩展, 几乎可以应用于自然科学、工程技术、金融、通信和商业等各种领域。
通过三维图形开发库OpenGL开发三维可视化结果, 使得开发出来的软件具有重用性、通用性、实时性等特点。
2 使用OpenGL技术的优势
OpenGL是个专业的3D程序接口, 是一个功能强大, 调用方便的底层3D图形库。OpenGL是个与硬件无关的软件接口, 可以在不同的平台如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之间进行移植。因此, 支持OpenGL的软件具有很好的移植性, 可以获得非常广泛的应用。
OpenGL显示列表 (Display List) 是由一组预先存储起来留待以后调用的OpenGL函数语句组成的, 当调用这张显示列表时就依次执行表中所列出的函数语句。OpenGL显示列表的设计能优化程序运行性能, 尤其是网络性能。它被设计成命令高速缓存, 而不是动态数据库缓存。蒙板缓存 (Stencil Buffer) 可以保持屏幕上某些部位的图形不变, 而其他部位仍然可以进行图形绘制。正确灵活地运用蒙板缓存, 可以实现对象的反射、折射和阴影等显示效果。利用OpenGL开发库驱动图形显示, 可以充分利用显卡的3D加速性能, 从而实现满足可视化要求的实时显示, 实现画面的流畅驱动。
3 实现步骤
3.1 建立应用框架
启动VC++6.0, 选择菜单File|New, 打开New对话框。在New对话框中选择Projects选项卡, 在列表中选择MFC ActiveX ControlWizard, 建立一个工程名为“OglInstrOcx”的控件工程。
通过AppWizard生成的框架应用是不支持OpenGL的显示。首先需要设置设备显示模式, 从而能支持OpenGL的显示。
接着, 需要设置OpenGL的视窗大小, 投影变换。这里的有些参数可以根据实际需要作相应的调整:
3.2 实现三维统计数字
为了实现三维数字的显示, 需要做3方面的工作。第一, 利用三维建模软件实现数字0到9的三维模型;第二, 利用工具把模型转换成CPP的输出文件;第三, 把生成的CPP文件内容加入工程中, 编程驱动。
首先, 要生成0到9的三维模型。在这里选用multigen creator软件, 当然, 用3DMAX等软件都是可以的。Creator软件为美国MultiGen公司新一代实时仿真建模软件;它区别于其他建模软件, 主要考虑在满足实时性的前提下如何生成用户需要的三维模型。其强大的建模功能可为众多不同类型的图像发生器提供建模系统及工具, 其Openflight输出格式在实时三维领域中成为最流行的图像生成格式, 并成为视景仿真领域事实上的行业标准。
打开creator软件, 新建一个空文件。在工具栏选择“Geometry”中的“3D Text”按钮, 弹出“Text”对话框, 在“Text String”编辑框中输入“0123456789”, 点击ok, 生成平面的数字模型, 如图1所示。
接下来, 在工具栏选择“Geometry”中的“Wall”按钮, 弹出“Wall”对话框, 在“Height”编辑框中输入三维数字的厚度, 点击ok, 生成三维的数字模型, 如图2所示。
保存三维数字模型, 输出文件number0.flt。
其次, 利用Deep Exploration三维模型转换工具, 把刚才生成的openflight三维数字模型转换成OpenGL CPP的代码。具体转化过程比较简单, 在Deep Exploration软件中打开number0.flt文件, 选择菜单“Save as…”, 在保存类型中选择“OpenGL CPP code (*.cpp) ”, 根据需要点击“Setting…”按钮, 设置输出的具体选项。因为, 需要把生成的代码嵌入到工程中, 所以在“Setting…”的cpp code中选择“Display list”类型, 生成number0.cpp代码文件。在这个文件中, 包含一个OpenGL对象显示列表的函数如下:
使用同样的方法步骤, 得到了number1.cpp至number9.cpp。利用这10个显示列表函数, 可以通过程序调用生成任意的三维数据显示。下面以两位数为例说明:
3.3 反射效果的实现
创建镜面反射显示效果, 使用蒙板缓存技术。首先, 需要先把各个缓存清空, 包括蒙板缓存。
接着, 需要设置作为反射面的对象。在这里, 把序号为1的显示列表对象floor作为发射平面。因为, 反射生成的影像都绘制在反射面上, 不需要深度检测。另外, 反射面只是作为蒙板的参考, 不需要显示, 所以设置了颜色掩码, 把参数设为GL_FALSE, 这样就不会在屏幕上绘制任何东西。
接着, 启用蒙板测试, 这样就可以修改蒙板缓存中的值了。蒙板函数用于确定一个颜色片段是应该丢弃还是保留 (被绘制) 。蒙板缓存区中的值与参考值进行比较, 比较标准是glStencilFunc所指定的比较函数。参考值和蒙板缓存区的值都可以与掩码进行为AND操作。蒙板测试的结果还导致蒙板缓存区根据glStencilOp函数所指定的行为进行修改。
启用了蒙板缓存, 只能在蒙板中值为1的地方绘制, 反射的实质就是在反射屏幕的对应位置再绘制一个物体, 并把它放置在反射平面中, 而这个物体的的Y向正好是反的:
由于在蒙板缓存上绘制的对象要与实际显示的floor融合在一起, 所以需要把OpenGL的融合打开, 并设置相应的融合系数。
最后, 正常显示周围的效果画面和三维统计结果。
3.4 动态阴影的实现
使用OpenGL蒙板缓冲区实现平面阴影, 关键是利用光源的矢量位置和地板的法线矢量, 生成平面阴影投射矩阵。然后:
4 结论