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

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.45/5 (5投票s)

2004 年 6 月 25 日

CPOL

4分钟阅读

viewsIcon

114945

downloadIcon

5151

一篇关于 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 绘图支持。 尽情地试验该程序,并务必将您想到的任何有趣或疯狂和古怪的设计发送给我!

© . All rights reserved.