65.9K
CodeProject 正在变化。 阅读更多。
Home

3D 逻辑沙盒

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (5投票s)

2013年8月22日

CPOL

14分钟阅读

viewsIcon

25584

内置可编程逻辑的 3D 沙盒


此应用条目已入选第二轮!

将定期发布此应用的进展更新。


我的应用已成功提交参加第二轮比赛。实现Aura界面需要花费一些力气,但我终于完成了。最棘手的两个部分是Aura要求的XML文件以及如何设置Aura需要的注册表值。我使用了Inno Setup来创建安装程序,以下是XML文件模板和Inno Setup脚本的注册表部分。您必须编辑的部分是红色的文本。

我使用Powerbasic for Windows(10版)编译器编写了该应用程序。应用程序的所有GUI方面都使用EZGUI 5.0 Professional(实际上是5.1 beta)完成。该应用程序唯一的依赖项是EZGUI运行时库DLL,ezgui50.dll(核心运行时711 KB),ezgui5gl.dll(OpenGL画布控件225 KB),以及两个较小的运行时DLL,总计超过57 KB。可执行文件(EXE)大小约为1977 KB,但其中约75%是嵌入的图形。

该应用程序完全便携,意味着不需要OCX(COM)组件、dot.net运行时、库注册,因此您可以随意将应用程序文件夹复制到U盘甚至skydrive文件夹即可运行。安装程序大小为1738 KB,我使用Inno Setup创建的。

该应用程序虽然是为配备27英寸显示器的All in One PC设计的,但实际上是为屏幕尺寸小得多的屏幕设计的,比许多Windows平板电脑上常见的1366 x 768分辨率还要小。该应用程序使用了EZGUI引擎中的自动调整大小引擎,因此可以缩放到不同的显示尺寸。随着分辨率的增大,一些字体会被替换成更大的字体,并且所有者绘制控件会根据显示器的大小改变每个项目的高度。

该应用程序有6个窗体。其中一个是启动闪屏窗体。主窗体有四个子弹出窗体,可以在需要时显示,这四个窗体在主窗体改变大小时会被重新调整大小和缩放。

主窗体在可视化设计器中的样子如下:

上图已缩小到原始尺寸的50%。原始尺寸可以在这里看到:

http://cwsof.com/codeproj/build1big.png

控件仅由一些静态标签控件(部分为所有者绘制)、一些按钮控件(全部为所有者绘制)和一个glCanvas控件(EZGUI运行时库中的自定义控件)组成。glCanvas控件提供了一个3D脚本语言,我用它来显示3D图像。

“3D模型库”按钮显示此窗体(在可视化设计器中所示):

除了若干所有者绘制按钮控件和静态标签控件外,两个关键控件是“文件列表框”(EZGUI库中的自定义控件)和“glCanvas”控件(EZGUI库中的自定义控件)。我需要微调文件列表框控件,使其不再响应双击来更改文件夹,而是响应单击,这样在使用触摸屏时会更好、更快。当在文件列表框中选择一个3D模型文件时,我会将其加载到glCanvas控件中,以便在实际使用之前可以看到模型。

2D布局窗体(在可视化设计器中所示)的样子:

在设计器中,我将显示所有可用模型的列表框控件定义为所有者绘制列表框。在设计器中,您只能看到每个项目的文本,但在应用程序中,使用所有者绘制,我会用文本和3D模型的快照来自定义每个项目的外观。由于3D模型本身不带快照,我该如何为这个所有者绘制列表框控件创建快照?在“3D模型库”窗体中,当用户选择一个模型时,应用程序会直接从Windows桌面截取glCanvas控件的屏幕截图。由于OpenGL的工作方式,我无法直接从glCanvas控件的窗口DC复制。它只返回空。但当我切换到从桌面复制图像时,我得到了正确的图像。我只需要计算glCanvas在桌面上的位置,然后从正确坐标复制。一旦我从3D模型库查看器窗体获得了模型的快照,我将其存储在一个位图数组中。现在,当2D布局窗体的列表框控件需要显示每个项目时,我只需在所有者绘制事件期间(EZGUI库在响应WM_DRAWITEM API窗口消息时生成%EZ_OwnerDraw事件)将位图的缩放副本绘制到项目的DC(设备上下文)中。

如上图所示,在可视化设计器中,我为列表框控件选择了所有者绘制功能,以及两者(我用于大多数控件以实现自动缩放)的比例属性,以便控件可以垂直和水平缩放。如果窗体大小发生变化(如果您调整了整个应用程序的大小),列表框控件也会根据窗体的新大小缩放每个项目的高度。项目的高度将始终在控件的总高度内显示三个项目。

由于我不喜欢列表框控件响应手势的方式(这是Windows内置的),我发现添加“上一页”和“下一页”按钮使滚动列表框更加容易和快速。

列表框下方用于模型的3D材质查看器只是一个glCanvas控件,我在这里显示八个球体,并在选择新材质时简单地更改它们使用的材质。球体能很好地显示材质的光泽度,因为球体能更好地显示光线反射。其余控件大多是所有者绘制按钮控件,因此如果需要,我可以动态更改它们的外观。例如,一些按钮上有一个小方块指示器,显示它们是否已被选中。这可以通过所有者绘制动态更改。

2D布局控件是一个普通的Canvas控件,它响应大小变化并根据当前大小重绘布局线。小图标(彩色小圆圈),代表每个模型的位置,不是通过绘制,而是使用精灵。这使得它们的图像与画布图像分开。当我需要更改它们的位置时,我只需更改精灵的位置。当我需要更改它们的状态(颜色和外观)时,我只需更改使用的帧图像。

主窗体的glCanvas控件将所有选定的3D模型显示为虚拟沙盒。我使用glCanvas控件的3D脚本语言来定义模型并更改其状态(位置、缩放、旋转等)。

我对该应用有很多功能的计划,但比赛提交的目标是演示我将使用的核心用户界面。例如,子弹出窗体,在显示时使用窗口动画,使其看起来像是滑入视图,而不是简单地出现。

这是我为提交申请而提供的描述应用的图片:

请注意,应用的不同截图展示了2D布局窗体如何也能与父窗体进行alpha混合,让您可以看到其背后的整个虚拟3D沙盒。此窗体使用WIN32 API中的分层窗口功能,因此可以进行alpha混合,产生玻璃般的外观(透明)。

这是我提交比赛的视频链接:

提交视频

第一轮概念文章原文


大家都很喜欢这个沙盒!

该应用程序针对**All in One PC**的**娱乐**类别。对于我们这些在当今技术时代之前出生的人来说,当有人说“人人热爱沙盒”时,您可能会很欣赏。不,我不是指操作系统的沙盒环境,而是指后院里传统的旧式沙盒。那么,为什么孩子们(以及一些成年人)会喜欢沙盒呢?因为它鼓励想象力和创造力。

现在,如果我们能将当今的技术与过去的经验教训相结合,为All in One PC和Windows 8创建一个3D沙盒应用程序,但有一个小小的不同之处呢?何不给沙盒添加一些可编程逻辑呢?

All in One PC因其尺寸、触摸功能和格式(可以平放或站立)使其成为该应用程序的理想设备。此外,可悲的是,这类设备的大部分功能常常被浪费在几乎没有真正持久价值的无聊游戏中。3D沙盒应用程序鼓励创造力,同时忠实于旧式沙盒的概念。无需华丽的3D游戏模型或复杂的动画。真正需要的是简单的,它可以让年轻人和老年人都感到愉悦。还记得我们小时候在沙盒里玩的那套塑料实色玩具吗?有些人喜欢西部主题。有些人喜欢农场主题。有些人喜欢恐龙。现在想象一下,在您的All in One PC上有一个3D沙盒,全家人都可以一起享受和玩耍。想象一下,成年人可以使用沙盒进行真实的现实世界设计,使用更复杂的3D模型。一切皆有可能!

那么,沙盒应用程序应该支持哪种文件格式?最接近我们与真实沙盒使用的格式。某种可以显示从简单到最详细的实心彩色对象的格式。

同时教授逻辑和编程技能

现在,在此软件中添加一种简单编程的能力。例如,想象一下设计一个太阳系模型,行星在真实的3D空间中实际移动。通过使用简单的拖放UI为沙盒的3D模型世界嵌入逻辑创建一个独特的界面,那么沙盒就可以栩栩如生,并且是真正的3D!

那么,哪种文件格式呢?

随着3D打印如今风靡一时,STL文件格式变得越来越受欢迎,并且有越来越多的在线资源可供下载免费的3D模型。其中一些模型非常简单,只需要很少的计算机能力来操作。另一些则非常复杂和详细,需要运行ICore CPU和更好图形芯片的All in One PC所具备的处理能力。

我将使用**STL格式**来加载和显示3D模型。网上现在有成千上万的免费模型可用,所以软件用户将有充足的选择,让他们的想象力驰骋。即使是成年人也会喜欢使用3D沙盒进行更实际的用途,甚至可能用于商业和教育。想象一下,妈妈在她自己的3D沙盒里用3D展示她新的客厅家具。

由于这款软件用途广泛,它使得投资All in One PC更具实用性。与其他几百美元就能买到的电脑不同,All in One PC的高成本需要有更好的用途,而不仅仅是玩一堆无聊的视频游戏。总会有新的方法来使用这款软件,但它仍然易于使用,不复杂。每个人都知道如何在沙盒里玩,不是吗?

从简单到复杂

孩子们会喜欢可用的简单3D对象。将提供数十种简单的3D图元,以便他们能够使用这些简单图元构建完全独特的东西。每个人都记得小时候玩积木!

将提供数十甚至数百种可缩放的3D图元。尺寸、形状和颜色(以及纹理)的选择将几乎是无限的。

使用STL文件格式,也可以在沙盒中使用从简单到极其详细和复杂的3D模型。

即使是爸爸也可以享受使用这款软件。想象一下,他下载了一些他需要在工作中设置的大型机械的3D模型,然后他使用3D沙盒来完成一些在家里的工作,用3D布局机械,看看如何最好地利用工厂的空间。或者,也许爸爸想设计自己的工作室,里面有最新的电动工具。他下载了一些木工机械和橱柜/桌子的3D模型,然后使用3D沙盒来布局他的新工作室。

软件开发

这款软件的核心将是3D界面。我将使用PowerBasic 32位原生代码编译器(Windows平台)和EZGUI 5.0 Professional。它使用OpenGL 2.0作为其glCanvas控件的后端。因为它是一个真正的窗口类(控件),我可以在普通的WIN32用户界面(使用真正的原生控件)上使用该控件的多个实例,而不是只能全屏或单个OpenGL窗口。这使得构建更自然、更直观的界面成为可能。glCanvas控件内置了3D脚本语言,因此甚至可以将脚本语言的某些方面暴露给最终用户。glCanvas控件原生支持3D图元语言以及STL 3D文件格式。即使是巨大的STL模型(数百万个多边形)也可以快速加载并以合理的显示速度呈现。All in One PC的图形处理能力越强,能使用的3D模型就越复杂。

glCanvas控件实际上非常独特,因为它是一个混合控件。它将普通的Canvas控件与其2D精灵引擎合并,用于绘制背景,并将3D对象叠加在其之上。这意味着可以在显示中使用2D图形和3D图形。

使用的GUI框架只有大约1兆字节大小(包括所有图形功能),并且除了操作系统之外不需要任何东西(没有dot.net,没有COM组件)。它非常小巧高效,甚至可以在旧式电脑和当今功耗较低的触摸屏PC(使用Atom CPU)上运行。因此,这款软件在All in One PC上也能运行得很好,即使是更轻、更小、计算能力更弱的(例如基于Intel Atom的SOC或片上系统)。想象一下,一个All in One PC非常轻便,易于携带。也许未来的某些All in One PC会像几磅重一样轻。

PowerBasic编译器在开发方面也带来了好处,因为它具有非常强大的字符串命令集,因此构建应用程序逻辑方面的复杂解析器(以便沙盒可以被编程)比平时更容易。

软件开发者

除了是一名长期的WIN32程序员外,我还有很强的创造力。我喜欢亲手制作东西,从木工到建造自己的船。我喜欢设计。我喜欢处理图形,包括3D。我来自一个所有孩子都很有创造力的家庭。这个软件项目需要的不仅仅是对编程的热爱和天赋。它需要设计和创造力方面的天赋。因此,与其评论我的编程技能,不如说创造力方面可能更重要。构建能促进创造力的软件,而不是仅仅浪费时间,这更符合我的喜好。我实际上将我的许多编程技能归功于我过去的简单创造性爱好,例如沙盒体验,学习动手工作,以及享受音乐和艺术。这就是为什么我认为编程不仅仅是一项技能或大学培训问题,而是一种可以表达自我的艺术形式。即使是调试,也更像是一种艺术形式,而不仅仅是软件工具的问题。我认为调试更像是一名侦探,像夏洛克·福尔摩斯一样,而不是依赖大量技术来完成所有工作,这在我编写的程序中得到了体现。我的客户是程序员而不是最终用户,他们依赖我开发的工具的质量和可靠性。

这个软件项目的逻辑方面很可能教授编程书籍中没有教授的技能。通过为软件添加逻辑元素,用户应该能够磨练他们的逻辑技能,这些技能实际上非常有用,如果他们以后尝试学习编程的话。

注意:有关我编程经验的更多信息,请阅读我的简历。

© . All rights reserved.