5.6 OpenGL3D界面展示及改进

5.6.1 OpenGL介绍

OpenGL是一个图形库,用来渲染2D、3D图形。它并不是一个API(Application Programming Interface)应用程序编程接口,仅仅是一个由Khronos组织制定并维护的规范。这个规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现的,将由OpenGL库的开发者自行决定。

OpenGL库的开发者通常是显卡生产商,主要是英伟达(Nvidia),电脑上的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。不管是Windows,Linux还是macOS,都有针对于其宿主机的显卡驱动,通常更新驱动都能获取到最新的OpenGL版本。

5.6.2 界面基础显示功能

在Qt中实现OpenGL主要分为两步,第一步是继承QGLWidget,第二步是重载三个虚函数(void initiateGL(),void resizeGL(int w, int h),void paintGL())。

图5.7 Qt中实现OpenGL

上述三个虚函数是构建OpenGL整个框架的关键。initiateGL函数是用来初始化OpenGL,包括设置着色模式、背景颜色、深度缓存等等;resizeGL函数在窗口尺寸发生变化时,会自动运行,然后触发paint事件,它包括重置当前视口,选择投影矩阵和重置投影矩阵;paintGL函数是用来渲染OpenGL场景的,在窗口移动时会调用,或是窗口在隐藏和显示之间变换时被调用,包括平移、旋转、缩放等函数。

根据三个基础函数,可以实现如下所示的基础显示功能:

  • 建立三维坐标系,并根据刀具末端的移动坐标绘制运动轨迹;
  • 点击并移动鼠标,可以转换视角,从多角度观察绘制出的运动轨迹,找一个最佳角度可以看的更清楚;
  • 缩放鼠标滚轮能够放大/缩小运动轨迹,看清一些雕刻的细节。

为了实现基础功能一,需要绘制三维坐标轴,即drawCoordinate函数。根据不同轴的颜色,调用glBegin和glEnd函数来绘制x、y、z轴,然后调用glTranslatef函数和glRotatef函数来对坐标轴进行适当的平移、旋转。

为了实现基础功能二和三,需要调用鼠标触发事件,即函数mousePressEvent、mouseReleaseEvent和mouseMoveEvent。原理是当鼠标移动时,记录移动前的角度和移动后的角度,通过旋转视角函数来触发paintGL函数,对OpenGL3D界面进行一次更新,可以调整到我们想要的角度进行观察。

最后,通过DrawShape函数来进行画点。每当定时器触发,开始向指定数组中存入当前位置,随后开始更新画布,每次更新都会画出数组中所有点并连成线,不同运动方式的点有不同的画法。最终画布上的运动轨迹是在直线插补过程中的点连成的线。

5.6.3 改进功能

在基础的OpenGL3D界面中,有一些明显的问题。例如,当我们导入G代码文件后,随着刀具末端的移动,OpenGL画布上显示的运动轨迹看的不是很清楚,只要不停移动鼠标,找到一个合适的角度,才能看清楚真实的雕刻图案,大大影响了我们查看雕刻成果的效率。“党徽”的运动轨迹如下图所示。     

图5.8 改进前运动轨迹

只有当调整到合适的角度时,才能显示得比较清楚,如下图所示。

图5.9 调整角度后的运动轨迹

因此,我从原始的代码中分析,思考如何改进才能使OpenGL画布上的运动轨迹无需不断移动视角,就可以观察到清晰完整的图像。由于整个运动轨迹其实是由一个个的点连起来形成的,所以考虑改变点的颜色,使得整个图像在视觉上看起来更显眼。当我只将画点的画笔颜色改为深蓝色时,经过实验发现,只是在视觉上看起来更显眼,但是在具体的雕刻细节方面,仍然需要通过旋转改变视角的方式去观察,并没有真正解决问题。

最后,经过上网查资料和与组员们的讨论后,我决定设置一个color_degree的变量,使得画笔的颜色随着坐标在z轴上的变化(即雕刻的深度变化)而线性改变,这样能起到一个很好的渐变效果,预计也能达到我们的期望。在导入“党徽”的G代码文件后,点击运行,随着刀具的移动,能够在OpenGL画布上清楚地观察到雕刻的细节,而无需切换角度。当调整视角从z轴观察整个雕刻深度的变化时,可以更加立体地看到雕刻的效果。“党徽”的三维效果图如下所示。

图5.10 改进后的运动轨迹

初次以外,我们还更换了更为复杂的校徽G代码做了实验,发现这样的画笔颜色渐变处理对复杂的图案有着更好的显示效果,这也为我们后续雕刻“龙腾云起”和“凤舞九天”这样及其复杂的图案定下了良好的基础。校徽的三维效果如下图所示。

图5.11 复杂图案的运动轨迹

5.7 ui界面开发总结

ui界面开发的过程是一个复杂且繁琐的过程。其中涉及非常多细节和主观的设计。包括各个窗口的布局、窗口的切换、窗口的背景以及各种各样的个性化设置等。经过不断的试错,ui界面需要反复进行细微处的修改。如下所示,为ui界面开发的基本流程。

图5.12 ui界面开发基本流程

ui界面的设计包括ui基础框架搭建,个性图标设计以及设计Qss美化ui界面。其中ui基础框架决定了软件的界面的布局以及软件的操作合理性,在ui基础框架搭建过程应当注意布局的合理性和可操作性。图标设计方面采用了阿里巴巴公司旗下的icofont图标矢量库。该矢量图标库是阿里妈妈MUX倾力打造的矢量图标管理、交流平台,该平台支持用户上传自己设计的图标,并支持自定义下载多种格式的icon。至于美化ui界面方面,可以在Qt样式表中去实现。样式表通过一个QStyle的一个叫做QStyleSheetStyle的特殊子类来实现的。这个特殊的子类实际上其他的系统特定风格类的包裹类,它会通过把样式表指定的自定义外观风格应用在底层的系统特定风格之上。我们可以通过这个样式表设定整个ui界面的背景并且保持其余部分风格的统一,还可以设定字体和控件的属性。最终美化结束后,基础的ui界面如下图所示。

图5.13 ui基础界面展示

第六章 G代码的生成与使用

6.1 ArtCAM软件简介

ArtCAM软件产品系列是英国Delcam公司出品的独特的CAD造型和CNC、CAM加工解决方案,是复杂立体三维浮雕设计、珠宝设计和加工的首选CAD/CAM软件解决方案,可快速将二维构思转换为三维艺术作品。全中文用户界面使用户能够更加方便、快捷、灵活地进行三维浮雕设计和加工,广泛地用于雕刻产生、模具制造、珠宝生产、包装设计、纪念章和硬币制造以及标牌制作等领域。

6.2 G代码的生成流程

G代码是最为广泛使用的数控编程语言,有多个版本,主要在计算机辅助制造中用于控制自动机床。在本次实习的三维运动总体平台中,可以使用雕刻图形转换而成的G代码文件进行雕刻。而ArtCAM软件可以生成G代码形式的Tap文件。按照如下步骤生成G代码:

  • 打开ArtCAM软件,新建项目;
  • 将图片导入新建的项目;
  • 设置图片相关参数及属性,进行图片长宽高的参数设置,并在3D视图下光顺浮雕,设置并观察效果;

在我们导入如下所示的龙凤图案后,得到光顺后的浮雕3D阳模如下图所示:

图6.1 导入的龙凤图案

图6.2 浮雕3D阳模

  • 之后选择刀具路径、设置刀具参数,这里我们选择平底刻刀2mm精度;
  • 选择刀具加工方式和设置材料厚度,进行动态仿真;
  • 仿真后选择“保存刀具路径”,输出文件为G-Code(mm)(*.tap)。

如下所示为生成的G代码示例:

图6.3 G代码示例

以下为生成G代码的流程图。

图6.4 G代码流程图

6.3 G代码的使用要点

如下为G代码在实际使用中的一些要点:

  • 在导入图片时最好选用第一种方法,用第二种方法时不会出现设置厚度,这时需要就右键点击产生浮雕,然后选择高度,但这样容易产生厚度的叠加,打乱之前的厚度设置,产生不必要的麻烦;
  • 按照我们实际操作中的经验,加工阳模(凸)时,模型厚度最好选择3毫米,这样雕刻出来的模型更清晰;
  • 按照我们实际操作中的经验,雕刻文字模型时,最好选用阴模(凹),雕刻图案模型时,雕刻阳模(凸)会使图案效果显示更加立体;
  • 雕刻较为精细的模型时,所选取的刻刀的刀尖直径要小;
  • 雕刻阴模对刀时,刻刀尽量不要碰到塑料板,可以使图案只有阴模而无矩形刻痕;
  • 雕刻阳模对刀时,刻刀可以碰到塑料板,无伤大雅;
  • 不要忘记修改G代码中进给速度F在0~30之间。

第七章 作品展示

图7.1 雕刻作品展示

上图的雕刻作品包括龙凤两大寓意美好的神物,其中“龙腾云起”和“凤舞九天”文字采用阴模雕刻,图案采用阳模雕刻。左侧飞龙图案采用深度为2mm雕刻,右侧采用3mm雕刻。2mm雕刻用时较短,但图案立体度不够;3mm雕刻图案更加立体,但用时较长,总体来说都栩栩如生,验证了三维雕刻机系统的实用性。