GDI+ 3D 演示(使用 C#)






2.45/5 (5投票s)
一篇关于 3D 图形和 C# 的文章。
引言
这个小程序是我学习 C# 的 GDI+ 功能时开发的。它还使用了我之前在 (Amiga) 平台上用 C 语言编写的代码。作为 C# 和 GDI+ 的新手,我非常感谢有用的反馈,以及任何演示动画建议。
使用代码
使用 C# 编译器构建并运行该示例作为 Windows 窗体。 我使用了 Visual Studio,为了快速编码,我发现 Jeff Key 的免费 Snippet Compiler 在 www.sliver.com 非常棒。 程序运行时,您应该会看到一个具有渐变色的螺旋球形,最初您正对着球极。
我将介绍程序代码和所用过程中的一些要点。
首先,创建一个 Bitmap
对象 bmap
,如果您使用 System.Drawing
函数,则实际上不需要它,但我使用它开始探索双缓冲。 此外,为了使用 Bitmap.SetPixel
方法,必须有一个位图对象。 另一个 Bitmap
对象 bm
不用于绘图。 它的功能是清除 Form 位图,以便球体的新旋转视图不会从隐藏的位图 bmap
拼合到 Windows 窗体上,并留下先前视图的伪影。 GDI 具有专门用于此操作的 blitter 函数,但 GDI+ 没有。
InitRot
函数将三个轴的旋转角度(以度为单位)作为来自用户控件的输入,并输出用于球体旋转计算的值,这些值与构造球体本身的计算相结合。 球体对象计算产生 x、y、z 坐标,以逐像素地描述一个 3-D 球体,从球体对象的一个极端的 x 坐标开始,计算所有相关的圆形 y 坐标,然后递增 x 并重复查找相关的 y 点等,直到到达相对的极点。
注释掉读取以下内容的行
if((j+i)%64 >= 0 && (j+i)%64 <=32)
您会看到这种点的增量绘制会产生一个普通的球体作为输出。 此行所做的是有选择地过滤 x 点,实际上,比平时更快地递增 x,从而形成从一极到另一极的螺旋线。 mod 除法用于创建多个螺旋线,而不仅仅是一个。 您可以通过替换注释掉的行 if(Math.Abs(j-i) <=12)
为使用 mod 除法的行。 您必须先输入 x 或 y 旋转,因为单个螺旋的初始极点视图不能清楚地显示这一点。 顺便说一句,我尝试使用 Point
数组,然后使用 unsafe
指针对其进行索引以形成螺旋线,但结果过于繁琐。 在这里,一行代码对我来说工作得更快更好。 具有可变索引访问 Point
数据的数组将开启更多的图形设计可能性。 所以我还在研究它,但是如果更有经验的 C# 程序员可以建议一种使用 System.Array Class
的方法,我愿意听取。下一个 if
代码块
if( z2 > 0 ) { ...
检查 z 坐标以查看它们是否输出负结果。 如果是这样,则表示 3-D 空间中的点位于球体的隐藏侧。 通常会跳过这些点而不绘制,因为我们只能看到前表面。 但是,在这种情况下,由于螺旋线具有允许一些背面螺旋线透过的切口部分,因此将这些点的 SetPixel Color
参数设置为灰色渐变。 前面的螺旋是彩色渐变。 GDI+ 具有良好的颜色渐变方法,但在这里,以这种方式编写也更容易,特别是因为我处理的是 3-D 和图形的旋转变化。 需要大量的代码来定义 GDI+ 调用的边界或路径。结论
来自 Microsoft 的最新消息是,Avalon(Longhorn 的图形包)将提供 3-D 绘图支持。 尽情地试验该程序,并务必将您想到的任何有趣或疯狂和古怪的设计发送给我!