使用计算机模拟数控加工,对NC程序的运行进行图形仿真,以此检验NC程序和加工方法的正确性,是一个非常有益的尝试。但是,仿真技术涉及大量的计算,效率低、耗时多,不能用于实际生产中。离散的方法能使计算量大大降低,在物体空间离散毛坯和刀具能获得毛坯切削后的精确表示,有利于对切削结果进行有效的观 察分析,更适用于NC程序的验证[1~3];Van Hook[4~6]采用图像空间离散法实现了加工过程的动态图形仿真,他使用Zbuffer消隐思想,将实体按图像空间的像素(pixel)离散,将计算 简化为视线方向上的一维布尔运算,较好地解决了实时性的问题。
但是,传统的图像空间离散方法不能提供有效方便的观察分析手段,限制了它的应用。笔者根据Van Hook图像空间法的思想,对数据结构和算法作了改进,使得在不失去仿真实时性的前提下,为用户提供了更多、更方便有效的分析观察手段,而这些手段原本具有物体空间方法的特点。
1 Van Hook算法的基本思想
图像空间方法使用类似图形消隐的Zbuffer思想,将工件和刀具按屏幕的像素离散为Zbuffer结构。切削过程简化为沿视线方向上的一维布尔运算。本 法将实体布尔运算和图形显示过程合为一体,使图形仿真有很高的实时性。
1.1 Zbuffer方法

图1 Zbuffer方法说明
见图1,视线方向与屏幕垂直,沿视线方向将毛坯和刀具离散,在每一个屏幕像素上,刀具和毛坯表示为一个长方体,称为Dexel结构(即Zbuffer结构)。刀具和毛坯之关系有7种,此时,刀具切削毛坯的过程就变为两套Dexel结构的比较问题,具体的运算过程用以下的算法说明:
CASE 1:只有刀具,显示刀具;break;
CASE 2:毛坯遮挡刀具,显示毛坯;break;
CASE 3:刀具切削毛坯的后部,显示毛坯;break;
CASE 4:刀具切削毛坯的内部,显示毛坯;break;
CASE 5:刀具切削毛坯的前部,显示刀具;break;
CASE 6:刀具遮挡毛坯,显示刀具;break;
CASE 7:只有毛坯,显示毛坯;break;
对应于每一个像素的Dexel结构构成链表结构,可处理毛坯有洞和空腔的情况。切削计算实际上是发生在对应于同一个像素、分别表示毛坯和刀具的两个 Dexel结构链表之间的布尔运算。
1.2 Dexel结构的生成

图2 Dexel结构与显示缓存结构和屏幕像素的对应关系
首先,定义观察坐标系(见图2):设毛坯为长方体,其中心位于坐标原点,以用户的视线方向(Xe,Ye,Ze)为Z1轴,XY平面上过原点且与Z1垂直的直线为Y1轴,再由Z1和Y1可以确定X1轴,X1Y1平面即为投影平面。
Dexel结构是在观察坐标系中建立的。因为屏幕上的像素点并不是对应于投影平面上的一点,而是一个小正方形。所以,应以正方形的中心为有效点,以视线方向(Xe,Ye,Ze)定义射线,它与物体求交而生成Dexel结构。
Dexel结构中的信息包括最近的Z值、最远的Z值、最近处的颜色、最远处的颜色以及指向下一个Dexel结构的指针。
1.3 边界问题

图3 边界点的计算
在求Dexel结构时,视线与毛坯求交的位置不同,有可能出现错误(见图3),图3中的3个点是不一样的。点A是毛坯的突出部分,计算涉及两个面,这一点 对应柱体的厚度为零;点B属于两个面,但在计算时应看作一个点,柱体的厚度取决于其它面的计算结果;点C是毛坯轮廓上的点,对应柱体的厚度也为零。计算这种边界条件时,须认真控制计算误差,以保证不会出现错误。
2 算法的实现
基本的图像空间算法有很大的局限性。首先,当需要改变视点从另一方向观察时,需要重新计算;第二,它不能很好地推广到验证方面,因为不能充分地确定容差,尤其在工件的尺寸远大于容差或错误落在视区之外时;第三,差异的测量仅与一个任意选择的视线有关,而不是来自设计工件的模型数据。笔者对基本的图像空间算 法作了改进,较好地解决了上述问题。
2.1 改变视点
能够改变观察位置,将有助于用户分析加工的正确性。但是,在基本的图像空间算法中,只要视点确定以后,数据结构也就确定了,仿真过程在这个数据结构上执行,即数据结构的生成只与视线方向有关,改变视点需要重新计算数据结构。
经过分析后发现,只要对当前的数据结构和算法稍加改进,就可以实现反向观察。因为每个Dexel结构都包含最远处的颜色信息,如果从反方向观察时,看到的 颜色就是链表最后一项的颜色。但是,在切削计算和显示时必须区分当前的观察方向(正向或反向),为了使在反方向观察时依然能进行切削仿真,Dexel结构 必须是双向链表。
另外,当保存多个同样的数据结构时,可以定义多个窗口和相应的观察方向,这样,可以向用户提供同时从几个方向观察加工过程的能力。事实上,如果定义两个窗口,并允许反向观察时,切削的大部分情况就可以表示出来了。在这种情况下,需要的存储空间和仿真时间都要多一些,因为需要保存和显示两套Dexel结构。
2.2 剖切观察
平行剖切是非常容易实现的,根据视线的方向和剖切平面(平行于任一个坐标平面),为每一个像素生成一个判定值,即Z值,在显示该像素时,将其Dexel结 构中的Z值与判定值比较,以决定毛坯的哪一部分被显示出来。
用户选择任意剖切时,要求用户指定剖切平面和方向,同样需要根据视线的方向为每一个像素生成判定值,以决定毛坯的显示部位。用户必须用位于毛坯上的3个任 意点来定义剖切面,如果用户选择的点不在剖切面上时,可以设定一个缺省值或指出错误。
2.3 数据测量
传统的图像空间离散方法被认为不能用于加工的验证中,因为数据的测量仅与一个任意选择的视线有关。但只要提高离散精度,就可为验证提供足够的信息,因为在毛坯与视线相交的每一点上,刀具的切削是足够精确的。因此可通过在屏幕上拾取点的方法得到毛坯在某一点的加工数据。
拾取点是屏幕上的像素点。利用生成和显示Dexel结构的算法,可以反算屏幕像素点对应的物体空间中的坐标,计算时应注意像素所对应的射线是每一个小正方 形的中心。为了区分出当前用户拾取的点,要求将该像素以特殊的颜色显示。
拾取点的精度取决于毛坯的离散精度,即在投影平面上的采样频率。因为切削结果在样本点处是精确的,但在其它地方并没有提供任何信息。所以,增加样本点会提高精度,但这取决于用户对精度的要求。同时,增加样本点要求更多的存储空间和相对较长的仿真时间。因此,用户要在速度与精度之间折衷。
2.4 离散切削
切削的局部性和扫描线的相关性,有助于减少运算和显示的时间。在计算每一步的切削时,可以只考虑投影平面上与刀具有关的那部分Dexel结构。在任一步切 削时,毛坯和刀具Dexel结构之间可以使用3种布尔运算的方法:
(1) 求出每步切削时刀具的扫描体,用扫描体和毛坯的Dexel结构进行布尔运算。但为每步切削求出刀具扫描体的Dexel结构将影响实时效果,同时,当扫描体出现自交时计算将非常复杂。
(2) 求出刀具全部切削时形成的扫描体,以这个扫描体的Dexel结构与毛坯进行布尔运算。但是,要求对切削的每一步进行实时显示时,将很难控制。
(3) 在两个刀位点之间进行插值,在每一个插值点用毛坯和刀具的Dexel结构进行布尔运算。插值的步长由用户根据精度、时间和空间要求来确定。较之前两者,这 种方法简便可靠、易于实现。
2.5 显示颜色值的确定
因为仿真的目的是以色调图的形式将加工过程模拟出来,并不追求图形的真实感效果。所以,笔者忽略光照模型,以减化颜色值的计算,这种忽略大大有助于产生实时效果,且在图形效果方面并未有大的影响。
为更好观察仿真效果,对刀具、夹具、毛坯及毛坯上切削新产生的表面都定义不同的颜色;考虑到刀具可能切削夹具的情况,也需定义一种颜色。同时,每种颜色也须有一定数量的灰度级。
通常设定的毛坯为多面体,在确定不同灰度时,根据法矢方向来计算:某点法矢与视线方向的夹角越小,亮度越大;夹角越小,颜色越暗。刀具可以用圆柱体(平底刀)或加上半球体(球头刀)来表示,确定灰度用与毛坯同样的方法。
切削后新产生的表面是观察的重点,为了表现出刀具(球头刀)在加工表面形成的波浪感,它的灰度级应当是比较多的。确定这种灰度需要刀具信息的帮助,切削后某一点的灰度定义为,切削时与该点接触的刀具上相应点的灰度值。
2.6 缩放
为了实现缩放功能,可以用加大样本点的方法,在求Dexel结构时,并不是按屏幕窗口的分辨率来计算,而是求出更多的Dexel结构,在显示时进行减色处理(见图4)。例如,对于256×256分辨率的窗口按1024×1024生成Dexel结构,通常以256×256显示,需要的时候,就可以将该图的任 一部分放大4倍。

图4 缩放观察原理
当采用这种方法时,需要的存储空间更大,并且缩放的倍数和次数是固定的,这些都取决于用户确定的离散精度。多数情况下,多个Dexel结构中计算的颜色各 不相同,显示一个像素时需要减色




