3D游戏编程

关键词: 经验 游戏 编程 开发

3D游戏编程(精选四篇)

3D游戏编程 篇1

关键词:Alice,3D环境,思维方式

1 Alice简介

Alice项目是美国卡耐基梅隆大学的一个学术性的项目,Randy Pausch教授是该项目的创建人,他希望通过此项目教会青少年如何在3D环境下编写计算机程序,它是一种全新的学习编程的方法,只要用日常的语言,就可以让屏幕上的一切三维物体在虚拟世界里服从你的命令,你就可以自己导演电影和创作计算机游戏了。学生可以把图片贴到一个物体上,还可以给物体增加各种简单的动作和脚本,让虚拟世界里的物体具有灵活性。

Alice是为初学者设计的一种直观式的3D绘图软件,里面有许多事先设计好的绘图物件、检视工具和控制物件的工具,它不必学习复杂的程序语言就能掌握计算机绘图,就算是刚开始学3D绘图的人也能轻松学会。许多美国大学把Alice作为计算机专业的入门课程开设,很多学生在学习了Alice之后对计算机专业产生兴趣。Alice的使用非常容易,用它绘制出来的图形可以直接储存成网页,甚至还可以直接导演一部动画!

Alice是一个免费的工具,它可以让学生学习到最基本的编程概念,即使学生是第一次接触面向对象编程,也能很快学会创建动画电影和简单的视频游戏。

2 Alice的基本功能

Alice提供了一个可拖动的图形界面,它由场景区、对象树、代码编辑区、对象列表、方函数方法细节区等六个部分组成。使用Alice编程你不需要自己写类和对象,它自身就提供了大量的对象库,只用根据提供的类创建对象即可。同样的,使用Alice也不需要写任何代码,只需要拖动对象的方法、函数块到代码区,Alice会根据提示自动生成代码,如图1:

2.1 创建一个项目

1)Alice创建一个项目,首先要进行场景的选择,再次就是进行人物的选择,最后在procedures区拖动功能块对人物动作进行程序设计;

2)选中要编辑的人物,对它进行动作设计,Alice是在3D环境下编辑的,它就像人一样,可以坐可以跳,只要你能想到的动作,就可以拖动程序块,对它进行控制,创造属于你自己设计的动画视频;

3)每一个对象(人、动植物等等)都有不同的关节、部位,就像java中一个类的数据成员,可以改变这些部位的位置或者对部位添加运动方法,即用类的函数成员对数据成员进行访问和修改。

2.2 高级功能

1)Alice除了它提供的属性、方法、函数,还可以自定义属性、方法和函数。在窗口右边顶上的白色矩形按钮那里选择不同的类,对其添加自定义的procedures、function、properties。

2)在initialize Event Listners的视图里可以添加视听,键盘、鼠标的响应就是在这里添加的。

3 Alice动画具体实现

Alice常用来制作3D动画和3D游戏,通过一个具体的动画实现,我们能很直观地看到Alice使用的方便、智能。做一个以“举办生日”为背景的动画,动画主要内容:主人公生日,邀请惟一的好友来城堡参加自己的生日宴。生日宴上食物的香味吸引了城堡外小鸟,小鸟飞到橡树上,它看到香蕉树下的香蕉,于是飞到香蕉树下,一跳一啄地到香蕉旁边。通过Alice自身带有的对象库和方法块,生成所需的对象,拖动方法函数块搭建动画,如图2:

3.1 动画的基本实现

1)在Setup Scene界面中使用Alice提供的类库向草地场景添加必要的对象。主要人物三人:adult Person、elder Person、teen Person,构成城堡的十面墙Castle Wall,桌子、椅子、蛋糕、碟子、树、鸟等等。

在Bird旁边添加虚拟相机camera1,用于之后镜头的转换。

2)将添加的对象移动调整到适合的位置、方向和大小,借助场景界面的相机视图和右边菜单栏的handle style。将城堡围城一个区域,这个区域的内部以及周围就是动画场景,然后把设置好人物以及其他对象的位置和状态,并把主相机对准adult Person。

3)添加Alice提供的方法块,让动画动起来。拖动左边的Person方法块Move Toward到代码区,设置移动目标和距离,让人物移动到距离桌子一定距离的地方。用同样的方法实现椅子的拉开,镜头的转换,小鸟的啄食动作,小鸟的飞行动作。

3.2 动画的高级实现

通过Alice提供的方法块我们无法直接实现逼真的动画,即使成功实现了,这些动作也不能运用到其他项目里。为了解决这个问题,我们需要给人物、小鸟单独建立一个测试项目,测试人物的走动、坐下、拉椅子,小鸟的飞行、啄食等等方法。测试完毕后,将这些方法块自定义成一个新的方法块,并装入各自的类中,就像java中不同类有不同的函数成员。

1)为Person类添加行走(Walking)方法:选中Person类,转到类视图下,将测试完成的方法块复制到Walking方法中,将方法的参数修改为P_SCamera,Obstacle,time,Reference。方法的作用:当Person距离参照物Reference距离小于2.0就不断向目标Obstacle走,同时P_Camera的镜头一直对准Person,运动时间由传入参数time控制。其中关键伪代码如下:

2)用同样方式给Person添加Sitting方法。方法参数修改为Chair,LR_Distance。因为Alice提供的腿部关节转动没有以膝盖为支撑点的转动,所以不能真正实现“坐下”这个动作,只能通过do together制造假象。

3)选中Flyer这个类,添加Jump和Go Fly两个方法。Jump函数实现Flyer向Move Direction方向移动,并一边跳跃一边啄食。Go Fly函数实现Flyer向Obstacle飞行的动作。相关代码如下图,其中通过Flyer的函数(function)is Colliding With设置循环(while)挥动翅膀的条件,关键代码如图3:

4)使用自定义的方法和类本身就有的函数、方法实现动画。注意动作的顺序、时间,比如相机的移动要跟随主要对象。

4 结束语

用Alice编程,让编程变得更有趣,它避免了一些传统编程方式下会产生的语法错误以及编译连接等等错误引起的困扰。运用Alice已有的对象库和已经写好的步骤编写一个动画或者游戏,即快捷方便又能直观地表现出来。当然,如果想要制作更逼真复杂的动画,也可以自己创建新的步骤。总结来说,Alice是一个很好的,能提起人们对编程兴趣的可视化编程软件。

参考文献

[1]新浪科技.11月TIOBE编程语言排行榜[EB/OL].(2008-11-20)[2016-03-29].http://tech.sina.com.cn/s/2008-11-20/1137881896.shtml.

[2]Dann W P,Stephen Cooper,Randy Pausch.用Alice学编程[M].付永刚,译.北京:机械工业出版社,2009.

[3]徐志红,尹禄,赵生慧,等.基于Alice培养大学生计算机编程能力的教学改革探索[J].蚌埠学院学报,2014,10(3):5.

游戏编程入门 篇2

经常有人问我,没有编程经验的人该如何开始开发游戏。在此之前,我总是一个个的尽力回答。然而,后来提相同问题的人数增长到难以处理的地步。我决定,是时候把我所有的建议写成文章,作为一个大概。

这篇文章是针对那些想要开发自己游戏,但几乎没有编程经验的人。事实上,我假设读者没有任何编程经验。我主要讨论游戏开发的程序和设计方面,而不是艺术性。我也不准备讲述如何进入游戏行业(这方面已经有足够的资料),而只是让你逐步的开始开发自己的游戏。最后,我所指出的这条道路也并不能作为唯一的,或是最好的路径来学习开发游戏,但至少对我和一些人很有用。选择一门语言

你要做的第一件事就是选择一门开发语言。你有很多选择,包括

Basic,Pascal,C,C++,Java,等等。也经常会有人争论对于初学者那一门语言是最好的。对于这一系列流行语言的讨论,你可以参看John Hattan的著作,What Language Do I Use?(我用什么语言?)

我的建议是以C和C++开始。有些人会说这些语言对初学者来说太高级了,但因为我自己就是学C++,我并不同意这一说法。而且,C/C++是当今使用最广泛的语言(译者认为应该是汉语。。),所以你可以找到大量学习资料和帮助。你先学C或C++都无所谓,因为只要学了一个,再学另外一个就很容易。但是,如果你先学C++,请保证在学习面向对象编程之前能理解和使用过程编程(等编程熟练再去学习类)。(译者:C是过程性语言,C++是面向对象语言)

如果你开始学习C/C++,发现太难,那再学一个简单一点的也没关系,比如Basic或Pascal。但是我真的认为,如果你坚持努力,而且有好的资料,学C/C++应该没有太大问题。

你的下一个问题可能会是:“我该怎么学C/C++?”我很高兴你这样问。最好的办法是上课。有老师可以回答你的问题,帮助你产生很大进步,编程练习作业也可以保证你能用到所学的东西。

如果你不觉得上课是个好主意,那最好的办法就是买一些好书。不要花太多时间去选一本什么“超级宝典”或“万用全书”,因为你最终可能会买几本。我建议你去一家书店,然后拿几本比较入眼的C或C++书看,直到找到一本或几本你能看懂,并且可以拿来学习的。同时,你可能会想要一些更深入的,或者一些材料,但是你一旦对于这门语言有了一些了解,我相信你应该有自己更好的选择。在这里,我有必要花一些时间,来说我看到很多初学者所关心的一个事情,特别是年轻人:没有钱买书和其他东西。首先,有很多免费资源可以利用,图书馆,Macmillan Computer Publishing(/personal),有成千上百的编程书籍。但是如果你真的想要成为一个好的程序员,还是应该投入一部分资金。应当想方设法(合法的)帮助你弄到一些钱。

网上也有很多C/C++的学习指南。但是我认为那只能作为补充而不是你自学的主要资源。

选择正确的编译器

你写的程序,或者代码,是以文本方式储存的,你甚至可以用记事本写C/C++程序。但是总需要有东西把他们转换成为可执行文件。对于C和C++,那就是编译器。

可用的编译器有好多种,包括很多免费的。选择一款自己适合的编译器很重要,免费的编译器就有这样的好处,你可以把它们试个遍,然后从中选择自己最喜欢的。然而,免费编译器比起商业版,可能会缺失一些功能和大部分服务。幸运的是,多数商业版编译器也兼售介绍版或学习版,这要便宜得多,通常功能却不见得少,唯一的限制是你不能发布用它编译的程序(短时间内你也根本用不着)。

总之,选择编译器取决于你能花多少钱,用什么操作系统,和为什么平台开发。如果要为windows开发,我强烈推荐Microsoft Visual C++。他强大的开发环境使得很多事做起来更方便,毫无疑问没有其他编译器更适合开发windows应用程序。如果你是个学生,你还可以折价买到。(译者:爽!)如果你在DOS平台开发,你最好的选择可能是DJGPP,免费的哦~。

选择开发平台

尽管最终你很可能为好几个平台开发,总要先选择一个来学。当你在学这门语言,还没有接触到图像的时候,你可能会想使用非图形用户界面的操作系统,比如DOS,Unix.这样可以避免接触高层,比如windows编程,让你集中精力学习语言本身。

一旦你做好开发游戏的准备,那么,应该考虑是否改变平台,让我们来看看每个选项的特征。

windows:如果你想成为游戏行业的专家,或者如果你想让许多人来玩你开发的游戏,那么,这就是你要选择的平台。因为多数你的用户使用windows,而且现在我也看不出有什么改变的迹象。当今大多数的windows游戏都是由一种你可能听说过技术---DirectX---开发的。你可以DirextX这个库直接访问硬件,这意味着你可以开发高性能的游戏。

DOS:DOS过去是占统治地位的游戏平台,但是已经一去不复返了。尽管可能有一些特殊爱好者还在为DOS开发游戏,现在没有一个为DOS开发的商业游戏,他也将继续衰落,直到微软不再支持。如果你只是想开发游戏,还是不要选择DOS,如果你非要这么做,也不要太久。记住:由于存在大量DOS游戏开发的书,可能还有人辩护从这些书中学习DOS游戏开发。但是,windows游戏开发的书越来越多,那些辩解也变得越来越无力。

Linux:Linux是Unix的一种,由于很多原因后来变得流行,包括稳定性,价格,和反微软情绪。尽管Linux用户还是相当少,但是围绕着他的热情和不断增长的市场潜力使其也成为不错的选择。

Macintosh:MAC有大量忠实粉丝并不能说明什么,几乎每一个和我讨论的MAC狂热者都需要更多更好的游戏。我没有见过多少MAC游戏开发资源,但我相信还是有的,因此这也是一个选择。

consoles:console(就是PS,N64,DC等等)的游戏市场十分巨大,当然

console游戏开发的前景也不错。然而以非商业的形式开发console游戏,出于各种原因,在现在似乎行不通。如果你开发console,很可能是在被商业游戏开发组雇用之后。

开始进入主题

现在是时候讨论开发游戏了。简单起见,我假设你选择用C/C++在windows平台开发,可能你选择别的,但大多数我说的还是有用的。

首先,甚至在你打算开始开发游戏之前,你必须很好掌握C和C++.你应该懂指针,数组,结构体,函数,可能还有类。如果你精通他们,就可以开始做游戏了。

这篇文章可能不能教会你所有关于开发游戏的东西。幸运的是,也没有这个必要。这方面有很多书,网上也有很多指南。GameDev.net应该有所有你想要的东西,这里我建议你怎么开始:

找一本或几本书。对于windows游戏开发初学者,Tricks of the Windows Game Programming Gurus是个完美的开始。除此之外,还有许多好书.读透这些书,试试所有的例子,不懂得部分多读几遍。

网上指南作为补充。除了弄清书上读到的,他们还涉及一些书上没有谈及的主题

向专家寻求帮助。如果你不能在书上或指南找到问题的答案,好好利用我们的论坛和聊天室。那里有好多专家愿意帮助别人。

这并不是要你按照顺序执行的,而是可以同时并且不断的重复执行。

光学习还是不够的,你必须运用你所学到的。从一个小游戏开始,然后在这个基础上前进。你可以看一下Geoff Howlands 的著作: How do I Make Games?

A Path to Game Development.开始,自己独立工作。不要急着加入团队,那样只会减缓学习过程。而且一旦你有了自己的几个游戏,你可以为团队做出更大的贡献。

还有关于书,你应该不仅仅看游戏开发的书。为了能够开发出你看到商店出售的游戏,你应该钻研比大多数游戏开发书籍更高级的一些主题。有一些可以在网上找到,但你也应该选一些图形学,人工智能,网络,物理学等方面的书。计算机科学学位看来唾手可得,但因为你被迫上这些课的时候可能认为他们和游戏开发无关----你错了!

包装

这里有一些提示很有用

不要只积累知识,用它:你永远不会知道会理解一些东西知道你是用他们。用你学的东西作些演示。做作书上的练习。

经常玩游戏:这样做会使你做出更好的游戏。而且可以减轻编程的枯燥。帮助别人:能帮别人的地方尽量帮助别人,教别人的过程中自己会学到更多。有始有终:不要有这样的想法“我能够完成这个游戏了,但是我又有一个新的想法,那就直接做下一个。”你可以学得更多如果你完成他,你也可以用事实证明你不是只会空谈。所以,尽量不要做很大很复杂的游戏,直到你有了一定经验。

深度解码3D游戏掌机 篇3

这有可能是历史上最为奇特的一部游戏掌机。

它继承了前任NDS的身躯,体内却流淌远祖Virtual Boy的血液。前者是历史上最为畅销的家用游戏主机,而后者却被广泛认为是任天堂光辉历史画卷上最为惹眼的一个污点。

3DS注定一波三折。早在去年9月任天堂秋季发布会上,社长岩田聪公布了日本首发日期和价格后,任天堂股价大跌;同样的情况也发生在任天堂在纽约的3DS预告会后。

过高的售价(250美元,任天堂历史上最贵的掌机),过迟的发售日期(错过了圣诞),以及前途未卜的裸眼3D技术,让任天堂的3DS在面世前遭到了来自市场的重重质疑。不少玩家表示,他们会选择持币观望。

可真到了正式发售日,日本各大零售店又现数百人长队的盛景,初期出货的40万台3DS在2月26日当天下午即宣告售罄。

一个月后,3DS登陆美国市场,依旧是彻夜排队的百人长龙。投资机构Lazard Capital Markets公布的一份报告显示,北美3DS的预定量是当初Wii预定量的2倍,该数据随后得到了北美任天堂的证实。市场调研机构iSuppli更是预测3DS将在今年内实现1100万的销量,但是,截至发稿,目前的销售情况高开低走,后劲似乎不足。

裸眼3D,古老的技术

对于3DS,争议最大的也是它的卖点—肉眼可见的3D效果。

这不是任天堂第一次涉足立体成像领域,早在1995年,任天堂就推出过史上第一部显示立体影像的游戏机Virtual Boy,由于理念、技术、售价等多方面的原因,市场反应非常惨淡,两年后即宣告停产。值得一提的是,Virtual Boy的设计者正是任天堂元勋、Game Boy之父横井军平。由于Virtual Boy销量不佳,1996年8月15日横井引咎辞职。1997年10月4日,横井遭遇车祸,不幸身亡。Virtual Boy也成为任天堂历史上鲜有的失败案例。

由于之前的失败经历,对于是否要再次踏足3D领域,在任天堂内部也引起过激烈的争论。其实在3DS的前期开发阶段,并没有引入3D成像的理念。直到2009年初,市场开始展现出对3D技术的好感和需求,裸眼3D技术趋于成熟,成本也降到了一个可以为人接受的水平线上,裸眼3D技术才被加入到3DS的开发议程中。2010年,卡梅隆的《阿凡达》开启了3D元年,市场热情空前高涨。于是,裸眼3D作为3DS 的主打卖点,成为一个顺水推舟的决策。

3DS主机上屏配置了一块由夏普生产的3D立体显示面板,拥有800×240的像素分辨率。在显示3D视频时,水平方向左右眼各对应400像素,所以在3D模式下画面分辨率实际上是400×240。

其实,红蓝3D成像技术最廉价,需戴特殊眼镜,其最大缺点就是颜色无法真实还原、偏色漏色现象严重。而3DS采用的是视差光栅裸眼3D技术,基本不存在以上问题,取而代之的是饱满的色彩、分明的层次和强烈的纵深效果。

同时,3DS的出屏效果也相当不错:在AR游戏(增强现实,亦称混合现实游戏)中,迎面袭来的石龙让我下意识躲闪,差点摔个踉跄;而在《任天猫狗》中,我多次在柴犬迎面跑来的同时伸手去抚摸空气。3D模式下,游戏角色就像是从画面中走出来的一样。对于我等在NDSL和Wii时代过惯了清教徒生活的玩家而言,难以相信这样的视觉体验会出自任天堂的手笔。

3DS采用的是视差屏障技术,其实现方法是在TFT液晶面板和背光模块之间安置一层偏振膜,在立体显示模式下,偏振膜会制造出两组400条不透明的垂直条纹。这些条纹宽几十微米,通过它们的光就形成了垂直的细条栅模式,在背光模块及LCD面板间形成所谓的“视差障壁”。在视差障壁的作用下,应该由左眼看到的图像显示在液晶屏上时,不透明的条纹会遮挡右眼;同理,应该由右眼看到的图像显示在液晶屏上时,不透明的条纹会遮挡左眼,将不同的图像分别投射到左右眼,其实就是欺骗大脑,使玩家看到立体的影像。

该技术是夏普欧洲实验室历经10年的研究成果,早在2002年底便已进入市场,所以严格意义上来讲,3DS采用的是一项颇为“古老”的3D显示技术。视差光栅技术最大的缺点是可视角度小,需要玩家保持相对静止的姿势以及适合的屏幕距离与角度。就算是頭部稍微移动,也会出现屏幕闪烁、3D效果减弱或者画面重影等问题,长时间的静止,容易产生疲劳感。

和很多人一样,我玩了10分钟左右就感觉难受,甚至想呕吐。对此,任天堂官方也承认3D画面比2D画面要更容易令人感到疲倦。

作为一家久经沙场的游戏厂商,任天堂绝对不可能将所有筹码全部压在裸眼3D这一项功能上。在3DS的上屏右方,任天堂妥协地设计了一个3D深度调节钮,可以在2D和3D两种显示模式之间进行自由切换,让玩家各取所需。

这是一个非常圆滑的做法,早在Wii时代,任天堂便有过类似的尝试—在已有体感控制器的情况下推出传统手柄,进而为Wii平台争取到了数目可观的传统游戏用户。

但反过来想,3D调节钮的存在,不就是宣告裸眼3D技术不够成熟吗?

拒当3分钟主机

3DS面临的另一个问题与Wii相似。

在发售初期,Wii凭借极具创意的操作方式和独特的战略,受到了玩家的大力追捧,在同索尼PS3和微软X360的竞争中占得先机,其累计销量甚至超过了X360和PS3的总和

“我买了一台Wii,它实在是太酷了,我每天都在玩,我要推荐我的朋友也去买一台。两个星期以后,我的朋友买了一台Wii,而我的那台Wii,则被我放进了杂物房。”这是很多Wii玩家的真实写照,刚入手的时候,独特的操作方式让它看上去很有吸引力,但用不了多久,新鲜感淡去,玩家的热情也就大打折扣。

一时间,3分钟主机成为了Wii的代名词。

因此,我们也看到了,任天堂为3DS整合了许多时下流行的热门技术,创造了更多可能性。

其中,最热门的是前文提及的AR技术(Augmented Reality,即增强现实技术,也被称作混合现实)。该技术通过对实时的视频图像进行信息传输和处理,将虚拟的信息应用到真实世界,真实的环境和虚拟的物体进行实时叠加,形成交互式的三维图像画面,为玩家带来更为真实的全新体验。

3DS随机附送6张AR卡片,其中包括1张游戏卡和5张人物卡。先来介绍游戏卡:首先,把AR卡片摆放在一个任何你能够想到的地方,然后把主机摄像头对准AR卡片进行识别,屏幕中会显示相应的3D图案,射击屏幕中的箱子即可进入游戏,不同颜色的箱子代表不同游戏。

以AR打靶游戏为例,其规则是瞄准屏幕中的靶子进行射击。屏幕中的靶场有可能是你的书桌、床单、地板⋯⋯总之就是摆放AR卡片的地方,从屏幕中看去,虚拟的靶子俨然已和真实环境融为一体。

3DS还附送了5张人物卡:将外置摄像头对准卡片,经过识别后相应的人物会以3D的形态呈现在屏幕中,你可以操控他们摆出各种各样的POSE。利用AR技术,可以实现真人与游戏人物的亲密合影—你可以把卡比捧在掌心,也可以尝试和马里奥勾肩搭背。

除了AR,体感操作也是3DS的一大卖点,加速感应、重力感应、旋转感应、两点触摸的存在意味着3DS基本上拥有了大部分时下移动设备流行的体感操作方式。

AR机能和体感操作的存在,的确能为玩家带来了更为新奇、更有创意的游戏体验。但现在首发游戏只有8款,包括足球、赛车、格斗等。在任天堂和第三方开发商做足功课前,3DS难逃“3分钟热情”。不过,正如iPhone问世初期,App Store尚未体现出价值前,用户也都表示过质疑。

觊觎掌上终端

可能你会问,除了拿来玩游戏,3DS还能做什么,打电话?上网?

抱歉,任天堂并不想让一台游戏掌机和iPhone或iPad直接竞争,但3DS可以是一个音乐播放器,有了它你至少不必再考虑iPod。它内置音乐播放程序,可以播放MP3和AAC格式的音乐文件。

3DS也可以是一台3D照相机。你可以利用外置摄像头为女友拍下一组3D照片,让她的“音容笑貌”时刻环绕在自己身边。我甚至玩了下合体拍照功能,看看我未来的baby会长成什么样子。

3DS还是一台3D电影播放器,你可以在3DS上享受3D电影带来的震撼。

3DS还是一台搜救雷达。“擦身通信”是沿袭自前任NDS的附加机能。在待机状态下,当两台或多台3DS处在一定的范围内,机器之间会自动发生通信、进行交换数据,同时还会亮起蓝色的灯光提醒用户。最近,网上流传着这样一个颇具魔幻色彩的故事:在日本的一次震后搜救工作中,某宅男志愿者打开了3DS的擦肩模式在废墟上来回走动,当走到一个瓦砾堆,3DS检测到附近有人使用3DS,并发生了擦肩通信。根据3DS的指示,救援队找到幸存者的所在地,成功进行了搜救。

任天堂为3DS整合了丰富的多媒体娱乐功能,让其成为人们手中的掌上终端,是任天堂对3DS的期望。除了索尼,苹果也许会是任天堂未来的最大竞争对手,毕竟对于一部分消费者而言,掌上电子产品只需要一两台就够了。在这种情况下,一台纯粹的游戏机,绝对不如一台拥有强大游戏机能的掌上终端来得更有吸引力。

3DS外观和操控都沿袭前作,可以向下兼容上一代NDSi的游戏,其WiFi可以訪问特定网络,2D显示效果佳,3D则在惊喜之后会感到不适。当然,它的另一个问题是售价250美元较高,iSuppli机构调研显示,其成本仅为100美元左右。虽然没赶上去年圣诞季,但3DS也避开了与今年秋季索尼预计发布的下一代掌机NGP直接竞争。

硬件方面,虽然任天堂未透露3DS具体技术参数,但据国外专业游戏站拆机发现,3DS有128MB内存,CPU采用了ARM11处理器(两枚),总频率达到了266MHz,相当于前代主机NDSi的两倍。

GPU则使用了一块频率为133MHz 的图形芯片,配有4MB显存。因此,3DS的整体图形处理能力相当为NDSi的2至3倍,相当于索尼PSP的1.5倍。同时,3DS整合了”高动态光照””自投影””法线贴图”等尖端图形处理技术,以及点阵密度更高的液晶显示屏。在2D模式下,3DS拥有接近PS3和X360的画面观感。即便是在2D模式下,玩家也能够获得极佳的视觉享受,3DS版《街头霸王4》和《死或生》便是最好的例证。

外观设计:★★★★☆ 游戏软件:★★★☆ 屏幕画质:★★★★ 3D效果:★★★☆

3D游戏软件设计 篇4

一、客观部分:(单项选择、多项选择、不定项选择、判断)

(一)、选择部分

(1)OPenGL常用的库里面,属于核心库的是()

A GL B GLU C GLAUX DGLUT ★考核知识点: OpenGL概述

(2)OPenGL渲染流水中,对光栅化描述正确的是()

A 把顶点变换成图元

B 把几何数据和像素数据转换为片断的过程。它将几何数据转换成片元,片元和要显示的像素一一对应

C OpenGL应用程序可以在几何物体上应用纹理图像,使它们看上去更为逼真D主要的内容就是裁剪,它的任务是消除位于半空间之外的那部分几何图元。在某些情况下,还要进行透视除法,用以得到归一化的设备坐标

★考核知识点: OpenGL概述

(3)下面对于OpenGL特点描述正确的有()

A标准支持灵活,可以用软件例程实现也可以使用软硬件组合使用 B具有灵活的伸缩性

C提供了一套良好的功能扩充机制,并且各个版本向后兼容 D跨平台,在科研和教学上是主流

★考核知识点: OpenGL概述

(4)1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了NT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用()

★考核知识点: OpenGL概述

(5)OpenGL(开放性图形库Open Graphics Library):是图形硬件的一种软件接口()

★考核知识点: OpenGL概述

(6)()是用于定义构成物体的三角形单元列表的坐标系。

A 观察坐标系B世界坐标系C本地坐标系D转换坐标系

★考核知识点: 状态管理和绘制几何物体

(7)glBegin()函数的意义是()A标志着程序的执行的开始 B标志着一个顶点数据列表的开始 C标志着OpenGL的绘制操作的开始 D标志着当前函数的开始

★考核知识点: 状态管理和绘制几何物体

(8)在win32程序中,主函数是从哪里进入执行的()

A GLMain B WinMain C Begin Dmain ★考核知识点: 状态管理和绘制几何物体

(9)OpenGL中在颜色索引模式下使用的用于选择单值索引的函数是()。A glIndex BglClampColor C glClear D glColor3f ★考核知识点: 颜色渲染和纹理贴图(10)下列哪个颜色不属于三原色()A红 B蓝 C绿D白

★考核知识点: 颜色渲染和纹理贴图

(11)OpenGL的光照模型根据材料反射的红、绿和蓝光的比例来模拟它的颜色。当一个纯红的球体,如果给球体仅仅投上绿色的光线,那么看起来球的颜色会是黑色()

★考核知识点: 颜色渲染和纹理贴图

A(0,0,0)B(255,0,255)C(255,255,255)D(1,1,1)(12)用函数glColor3i()函数设置的黑色的颜色值为()

★考核知识点: 颜色渲染和纹理贴图

(13)OpenGL中光照模型,被物体表面均匀的反射。即使光是被均匀的反射回去的,它直射的物体表面比从某个角度照射过来时要亮()

A环境光B散射光C镜面光D发射光

★考核知识点:环境光、散射光、镜面光、发射光

(14)OpenGL中如何判断一个点接收了光源的多少光线()

A通过距离光源的距离进行计算 B通过法线相对光源的方向进行计算 C通过物体的颜色值进行计算

D通过物体和光源的颜色值的综合考虑进行计算

★考核知识点:光照

(15)OpenGL提供了最大数目为N的单场景内光照光源模型,N为()

A 1 B 8 C 16

D不限制,只要为2的幂就可以了

★考核知识点:光照

(16)OpenGL光照模型中,有一种会将光源强烈的反射到了另外一个特定的方向。高亮 A镜面光B聚光灯光C环境光D发射光 度的光柱往往能在被照射的物体上产生称之为亮斑的亮点()

★考核知识点:光照

(17)OpenGL光照模型中,表面的发射颜色可以增加物体的强度,但是他们不受任何★考核知识点:光照 光源的影响,在整个场景中,并没有作为一种额外的光照()(18)设置光源位置时,当我们的光源坐标位置(x,y,z,w)中的w为0时代表我们的光为平行光源()

★考核知识点:光照

(19)OpenGL一个场景中至多可以在包含16个光源()

★考核知识点:光照

(20)用函数glColor3i()函数设置的黑色的颜色值为()

★考核知识点:绘制像素、位图字体和图像

(21)像素数据从可以开始从缓冲区读取到内存然后把像素数据从内存写入到帧缓冲最后在帧缓冲内部复制像素数据()

★考核知识点:绘制像素、位图字体和图像

(22)以下哪个函数可以设置当前的光栅位置()

A glTranslatef()B glRasterPos()C glRotatef()D glDrawPos()★考核知识点:绘制像素、位图字体和图像

(23)在绘制几何图形之时,我们可以使用glColor*()函数去设置当前颜色或者当前颜色索引()

★考核知识点:绘制像素、位图字体和图像

(24)在设置了光栅位置之后,我们可以使用glBitmap函数来绘制数据()

★考核知识点:绘制像素、位图字体和图像

(25)void glRasterPos2*(type x,type y);用于设置位图的绘制位置。()

★考核知识点:绘制像素、位图字体和图像

(26)glCopyPixels的像素路径包括()

A像素传输操作B基于片断的操作C在帧缓冲区暂存D光栅化操作

★考核知识点:绘制像素、位图字体和图像

(27)当我们的源和目标的alpha值都为0.35时,当使用函数glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)进行像素混合,得出的结果描述正确的是?()

A源和目标混合效果相同 B混合色更接近源 C混合色更接近目标 D无法判断

★考核知识点:混合抗锯齿雾多边形偏移

(28)启动混合后,如果绿色物体和一个红色物体用glBlendFunc(GL_ONE,GL_ONE)方式混合后,结果的混合部分的颜色为(D)A红色B绿色C白色D黄色

★考核知识点:混合抗锯齿雾多边形偏移

(29)图形学中称由于采样频率不足而造成的失真为走样,反走样通过多重采样改善图形锯齿效果()

★考核知识点:混合抗锯齿雾多边形偏移

(30)如果不进行混和操作,每个新的片元都被OpenGL当成是不透明的,覆盖掉帧缓存已存在的颜色值。()

★考核知识点:混合抗锯齿雾多边形偏移

(31)颜色定义中RGBA的A是alpha值,alpha值的作用是将已处理过的片元颜色值与存储在帧缓存中的像素颜色结合起来()

★考核知识点:混合抗锯齿雾多边形偏移

(32)当前属于颜色索引模式时,我们可以进行的操作有()。

A实现颜色混和操作B实现透明效果C实现颜色叠加D实现颜色渐变效果

★考核知识点:混合抗锯齿雾多边形偏移

(33)void glBlendFunc(Glenumafactor,Glenumbfactor)

其中参数afactor和参数bfactor分别用于指定源和目标的混合因子()

★考核知识点:混合抗锯齿雾多边形偏移

(34)颜色混合方程中,GL_FUNC_ADD实现的功能是()

A CsS+CdD B CsS-CcD C min(CsS,CdD)D max(CsS,CdD)★考核知识点:混合抗锯齿雾多边形偏移

(35)开启颜色混合的函数方式为()

A GL_BLEND B GL_BLENDING C GL_RENDER D GL_ENABLEBLEND ★考核知识点:混合抗锯齿雾多边形偏移

(36)一个矢量加上一个矢量结果为()

A一个矢量 B一个标量

C如果为零则不是矢量,其它情况下皆为矢量 D以上说法都不对

★考核知识点:图形变换的数学基础

(37)两个矢量之间的点乘结果为()

A一个矢量 B一个标量

C如果为零则不是矢量,其它情况下皆为矢量 D以上说法都不对

★考核知识点:图形变换的数学基础

(38)glLoadIdentity()函数对于4×4矩阵操作结果为()

A [0,0,0,0;0,0,0,0;0,0,0,0;0,0,0,0] B1,1,1,1;1,1,1,1;1,1,1,1;1,1,1,1] C[1,0,0,1;0,1,0,1;0,0,1,1;0,0,0,1] D[1,0,0,0;0,1,0,0;0,0,1,0;0,0,0,1] ★考核知识点:图形变换的数学基础

(39)我们在使用定义视口函数 glViewport 中,第三个参数有什么作用()

A描述视口的距离屏幕最左位置 B描述视口的距离屏幕最上位置 C描述视口的高度 D描述视口的宽度

★考核知识点:图形变换的数学基础

(40)通过矩阵[sx,0;0,sy]对二维的不经过原点的图元进行缩放变换,有可能得到的结果为()

A图元相对原点的位置变化了 B图元自身尺寸变化了

C图元可以只发生旋转,相对原点位置没有移动 D图元自身发生了旋转

★考核知识点:图形变换的数学基础

(41)从物体坐标到屏幕坐标的显示流程中我们必须要经过的经典的变换流水包()

A世界坐标系内地变换 B对窗口的裁剪操作 C窗口到视口的变换 D对模型进行坐标进行变换

★考核知识点:OpenGL的视图变换

(42)函数void gluPerspective(Param1,Param2,Param3,Param4)中,标示近裁剪面的是哪个参数()

A Param1 BParam2 C Param3 D Param4 ★考核知识点:OpenGL的视图变换

(43)哪些变换分别用于设定物体在世界坐标系中的位置、方向以及模型大小。()

A平移变换B旋转变换C缩放变换D投影变换

★考核知识点:OpenGL的视图变换

(44)()变换后的的几何体位于观察坐标系中。

A局部变换B取景变换C世界变换D空间变换 ★考核知识点:OpenGL的视图变换

(45)投影变换包括哪几种投影方式。()

A平面投影B透视投影C正射投影D缩放投影

★考核知识点:OpenGL的视图变换

(46)下对函数gluLookAt(0,0,0, 0,0,-3,1,0,0)描述正确的是

A观察点在原点(AD)B正方向为z轴负方向 C观察方向指向z轴正方向 D正方向为x轴正方向

★考核知识点:OpenGL的视图变换

(47)glRotatef(fRot,1,1,0)描述先按照X轴旋转fRot,接着绕Y轴旋转fRot()

★考核知识点:OpenGL的视图变换

(48)在OpenGL中如果要实现运动模糊效果,需要借助以下哪个缓冲区()

A深度缓冲区B帧缓冲区C模版缓冲区D积累缓冲区

★考核知识点:帧缓冲区

(49)当前程序的状态处于常规的绘图模式,那么接下来使用下列哪些函数可以退出当前绘图模式()

A glRender(GL_FEEDBACK);B glRender(GL_SELECT);C glEnd();D glBegin(GL_TRIANGLES)★考核知识点:帧缓冲区

(50)雾化效果在颜色索引模式下是不可用的()

★考核知识点:帧缓冲区

(51)如果我们需要使用OpenGL进行3维点选操作,那么可以通过函数glRenderMode()指定()进入选择模式

A GL_FEEDBACK BGL_SELECT C GL_PEEK D GL_MODEVIEW ★考核知识点:帧缓冲区

(52)OpenGL中如果锁住了深度缓冲区,那么所有的物体的深度就无法测试了,物体只是根据绘制的先后相互覆盖了()

★考核知识点:帧缓冲区

(53)绘制球体,我们使用函数:

void gluSphere(GLUquadricObj *obj,Gldoubleradius,Glintslices,Glint stacks);()

下面,我们对参数描述正确的选项有()A slice代表的就是经线的数目 B stacks参数代表的就是纬线的数目 C slice参数代表的就是纬线的数目 D stacks代表的就是经线的数目

★考核知识点:分割化和二次方程表面

(54)OpenGL中我们需要完成对NURBS对象的销毁,调用的函数是gluDeleteNurbsRenderer()

★考核知识点:分割化和二次方程表面

(55)常见的纹理寻址模式有()A重叠纹理寻址模式B镜像纹理寻址模式 C钳位纹理寻址模式D边界颜色纹理寻址模式

★考核知识点:分割化和二次方程表面

(56)gluQuadricDrawStyle 函数选择用于绘制几何形状的图元类型。系统默认的类型是使用三角条状图元来填充所要绘制的几何形状,填充模式默认为 A GLU_LINE B GL_FILL C GLU_SILHOUETTE D GLU_POINT ★考核知识点:分割化和二次方程表面

(57)绘制球体,我们使用函数:

void gluSphere(GLUquadricObj *obj,Gldoubleradius,Glintslices,Glint stacks);下面,我们对参数描述正确的选项有()

A slice代表的就是经线的数目 B stacks参数代表的就是纬线的数目 C slice参数代表的就是纬线的数目 D stacks代表的就是经线的数目

★考核知识点:求值器和NURBS(58)我们的B样条曲线(三次)和与贝塞尔曲线很相似,不同之处是此曲线会分解成很多的小段。每个给定段的形状都仅受到最近4个控制点的影响()

★考核知识点:求值器和NURBS(59)我们的B样条曲线(三次)和与贝塞尔曲线很相似,不同之处是此曲线会分解成很多的小段。每个给定段的形状都仅受到最近4个控制点的影响()

★考核知识点:求值器和NURBS(60)()是Direct3D用来存储绘制到屏幕上的每个像素点深度信息的一块内存缓冲区

A 广度缓存 B 深度缓存 C 深度测试 D 广度测试

★考核知识点:求值器和NURBS(61)OpenGL中我们需要完成对NURBS对象的销毁,调用的函数是gluDeleteNurbsRenderer()

★考核知识点:求值器和NURBS(62)纹理阶段混合状态用于指定当前纹理颜色值和Alpha值的混合方法()

★考核知识点:求值器和NURBS(63)通常情况下,深度缓存用于判断三维空间中物体的遮挡情况()

★考核知识点:求值器和NURBS(64)设置深度缓存是指设置深度测试成功时对深度缓存如何操作()

★考核知识点:求值器和NURBS(65)图形学中称由于采样频率不足而造成的失真为走样,反走样通过多重采样改善图形锯齿效果()

★考核知识点:求值器和NURBS(66)渲染后物体模型通常是由三角形图元组成的,我们称它为一个Mesh结构()

★考核知识点:求值器和NURBS(67)若要从缓存中只读不写数据,就不需要锁定缓存,用完后解锁()(68)如果我们需要使用OpenGL进行3维点选操作,那么可以通过函数glRenderMode()指定GL_SELECT,进入选择模式()

(69)在执行用于操纵名字堆栈的函数或调用glRenderMode()函数之后,如果出现了一次点击,OpenGL就会在选择数组中写入一个点击记录,所以,如果共享相同的名称对象,不会产生多条点击记录。()(70)在点击发生时,名字堆栈的内容从()的元素开始。A最顶部B上一个操作的位置C最底部D任意

(71)如果我们需要使用OpenGL进行3维点选操作,那么可以通过函数glRenderMode()指定GL_SELECT,进入选择模式()

(72)进行点选操作后,假设当前的选择缓冲区为pSelectBuff,那么其中的pSelectBuff[0]的值得含义是()

A自上一个点击记录之后,与视景体相交的图元的所有顶点的最小窗口坐标的z值 B自上一个点击记录之后,与视景体相交的图元的所有顶点的最大窗口坐标的z值 C点击发生时名字堆栈的内容 D名字堆栈中压入的名字数

(73)OpenGL中如果锁住了深度缓冲区,那么所有的物体的深度就无法测试了,物体只是根据绘制的先后相互覆盖了()

★考核知识点:选择和反馈

(74)名字堆栈形成了返回选择信息的基础,如果此时我们需要使用某个名称来替换名字堆栈顶部的元素,可以使用函数为()

A void glInitNames(void);B void glPushName(GLuint name);C void glPopName(void);D void glLoadName(Gluint name);★考核知识点:选择和反馈

(75)选择返回功能函数:

void glSelectBuffer(Glsizeisize,Gluint *buffer)对函数描述正确的是()A buffer参数指向的数组用于存放选择数据

B buffer参数指向的数组仅仅用于存放选择的物体ID C size表示这个数组可以存储单个数据的大小 D size表示这个数组可以存储的最大值

★考核知识点:选择和反馈

(76)用glSelectBuffer()函数指定用于返回点击记录的数组()

★考核知识点:选择和反馈

(77)使用函数 void gluPickMatrix(Gldoublex,Gldoubley,Gldoublewidth,Gldoubleheight,Glint viewport[4]);选择的挑选区域的中心是()A 世界坐标B窗口坐标C物体坐标D可以任意指定

★考核知识点:选择和反馈

(78)由于粒子之间的碰撞计算量很大并且对于大多数模拟来说没有必要,所以我们很少使用粒子之间的碰撞。()

★考核知识点:粒子系统

(79)粒子(Particle)是一种微小的物体,在数学上通常用点来表示其模型,所以显示和表示粒子时,我们通常使用点结构来描述。()

★考核知识点:粒子系统

(80)以下可以通过常见的粒子系统实现的是()A雪花B下雨C喷泉喷水D金属车漆效果

★考核知识点:粒子系统

(81)如果有两束光进入人眼,他们的成分为(R1,G1,B1)和(R2,G2,B2)那么叠加在一起的时候,如果蓝色分量超出1了,那么最后的叠加结果为()

A(R1, R2,1)B(R1+R2, R1+R2,1-R1-R2)C(R1+R2, R1+R2,1)D(R1, R2, 1-R1-R2)★考核知识点:混合效果

(82)Alpha分量主要是用来指定像素的混合计算比例的()

★考核知识点:混合效果

(83)D3DCOLORVALUE结构体中包含r、g、b和a4个分量,表示物体表面对各种反射光的各种成分的反射比率。r=0.0 g=b=a=1.0;r=g=0.0。此时红光和蓝光照射过来,只有蓝光被反射,即材质看上去为蓝色()

★考核知识点:混合效果

(84)OpenGL的光照模型根据材料反射的红、绿和蓝光的比例来模拟它的颜色。当一个纯红的球体,如果给球体仅仅投上绿色的光线,那么看起来球的颜色会是()A红色B绿色C白色D黑色

★考核知识点:混合效果

(85)平面着色模式,所有像素的Alpha值都大于等于该多边形的第一个顶点的Alpha值()

★考核知识点:混合效果

(86)像素的Alpha值就是用来做纹理Alpha混合时进行加权计算的的权值()

★考核知识点:混合效果

(87)Alpha测试并不把当前像素的颜色与颜色缓冲中像素的颜色混合,像素要么完全不透明,要么完全透明()

★考核知识点:混合效果

(88)OpenGL中指定源混和因子和目标混和因子的函数:

void glBlendFunc(Glenumafactor,Glenumbfactor)描述正确的是()A其中参数afactor和参数用于指定源混合因子 B其中参数bfactor用于指定目标的混合因子 C其中参数afactor用于指定目标的混合因子 D其中参数bfactorb用于指定源的混合因子

★考核知识点:混合效果

(89)常见的纹理寻址模式有()

A重叠纹理寻址模式B镜像纹理寻址模式C钳位纹理寻址模式D边界颜色纹理寻址模式

★考核知识点:纹理的高级技巧

(90)通过矩阵[sx,0;0,sy]对二维的不经过原点的图元进行缩放变换,有可能得到的结果为 A图元相对原点的位置变化了()B图元自身尺寸变化了

C图元可以只发生旋转,相对原点位置没有移动 D图元自身发生了旋转

★考核知识点:纹理的高级技巧

(91)创建一个矩形图元255*255,它的大小恰好与纹理图中纹理的大小一样,要映射整个图元面积,分配给图元纹理坐标为().A(0.0,0.0)(1.0,0.0)(1.0,1.0)(0.0,1.0)B(0.0,0.0)(255.0,0.0)(255.0,255.0)(0.0,255.0)C(0.0,0.0)(0.0,1.0)(1.0,0.0)(1.0,1.0)D(0.0,0.0)(0.0,255.0)(255.0,0.0)(255.0,255.0)★考核知识点:纹理的高级技巧

(92)三维纹理图像可以看成是由一层一层的二维子图像矩阵构成的,在内存中,这些矩形按顺序排列在一起。()

★考核知识点:纹理的高级技巧(93)对函数void glTexImage3D(Glenum target, Glint level,GlintinternalFormat ,Glsizeiwidth,Glsizeiheight,Glsizeidepth,Glintborder,Glenumformat,Glenum type, constGlvoid * texels);参数描述正确的是()A level是纹理目标在内存中的优先级 Blevel是mipmap细节层的序号 C level描述了纹理的强度程度 D描述了纹理的有效值取值范围

★考核知识点:纹理的高级技巧

(94)glCopyPixels()函数,但是并不把像素读到缓冲区,而是放在纹理内存中()

★考核知识点:纹理的高级技巧

(95)对OpenGL实现的Mipmap描述正确的是()

A它必须根据被贴图的物体的大小手动的确定应该使用哪个纹理 B它会根据被贴图的物体的大小自动确定应该使用哪个纹理 C Mipmap不需要一些额外的计算

D Mipmap并不需要额外的一些纹理存储区域

★考核知识点:纹理的高级技巧

(96)glPixelStore*()函数可以用于设置像素存储模式,使用诸如*ROW_LENGTH、*ALIGNMENT、*SKIP_PIXELS和*SKIP_ROWS这样的参数。这个函数用于控制对一个完整的像素或纹理单元矩形的一个子矩形的引用()

★考核知识点:纹理的高级技巧

(97)一个带有纹理图像的物体迅速的远离观察点而去时,纹理图像必须随必须被投影的图像一起缩小。为了避免闪烁抖动等人工痕迹,可以指定一系列预先过滤的分辨率递减的纹理图像称为()

A Vertex Shader B mipmap C HLSL D Cg ★考核知识点:纹理的高级技巧

(98)void glTexParameteri 第三个参数类型为GL_CLAMP描述正确的是

A将大于1.0的数值设置为1.0,将超出[0.0,1.0]范围的数值截取到[0.0,1.0]范围内 B这样会导致纹理边缘的重复 C将小于0.0的数值设置为0.0 D图象在物体表面上不断重复,但是每次重复的时候对图象进行镜像或者反转(99)纹理坐标比一定非要在RGBA模式下才可以能使用()

★考核知识点:纹理的高级技巧

(100)void glTexParameteri 第三个参数类型为GL_REPEAT描述正确的是A A图象在表面上重复出现

B自动将超出[0.0,1.0]范围的数值截取到[0.0,1.0]范围内

C图象在物体表面上不断重复,但是每次重复的时候对图象进行镜像或者反转 D这样的模式在纹理边缘处比较连贯

★考核知识点:纹理的高级技巧

(101)对函数glTexParameteri边界截取类型描述正确的是()

A GL_CLAMP_TO_EDGE B CLAMP_TO_BORDER_ARB C GL_REPEAT D GL_CLAMP ★考核知识点:纹理的高级技巧

二、主观部分:(程序设计,简答题

1关于现实字体的一段程序如下,运行截图如下,现有若干空缺,请完成填空。

我们完成创建字体的功能函数CreateFont()如下:

HFONT hFont;HFONT hOldFont;iBase=glGenLists(256);hFont=CreateFont(-24, 0, 0, 0,//高度 //宽度 //旋转角度 //定位角 //字宽设置 FW_BOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_DONTCARE|DEFAULT_PITCH, “Courier New”);

//使用字体名称为Courier New //保存之前的字体

hOldFont=(HFONT)SelectObject(hdc,hFont);//从系统下载的字体文件中生成这些位图

wglUseFontOutlines(hdc,32,96,iBase,0.0,0.2f,WGL_FONT_POLYGONS,gmf);//还原设备句柄为hdc,还原原来的字体类型 SelectObject(hdc,hOldFont);//释放资源

DeleteObject(hFont);2.关于二次曲面的一段程序如下,运行截图如下,现有若干空缺,请完成填空。

我们生成二次曲面的功能函数如下: //二次曲面的生成状态 GLUquadric *Quadric;//创建一个二次方程对象,指定这个二次方程对象的属性 Quadric = gluNewQuadric();//自动为二次表面生成纹理坐标 gluQuadricTexture(Quadric,GL_TRUE);//显示灯的列表 iLamp = glGenLists(1);glNewList(iLamp,GL_COMPILE);//激活纹理0地板的纹理

glBindTexture(GL_TEXTURE_2D,texture[2]);//绑定纹理

glBindTexture(GL_TEXTURE_2D,texture[2]);

2.如下一段程序,运行完成加载纹理的功能,现在有若干空缺,请根据上下文完成填写。

程序截图1 LoadTexture(){);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR

glPixelStorei(GL_UNPACK_ALIGNMENT,4);//绑定纹理

glBindTexture(GL_TEXTURE_2D,m_nBodyTex);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//BMP文件的handle HBITMAP hBMP;//存储BMP的数据结构 BITMAP BMP;byte Texture[1]={IDB_MISSILE};//产生三个纹理

glGenTextures(1,&m_nBodyTex);hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(Texture[0]),IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION);

if(hBMP){ GetObject(hBMP,sizeof(BMP),&BMP);

//构建二维Mipmap gluBuild2DMipmaps(GL_TEXTURE_2D,3,BMP.bmWidth,BMP.bmHeight,GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);//删除位图资源

}

3.如下一段程序,运行完成物体颜色和材质属性相关功能,现在有若干空缺,请根据上下文完成填写。DeleteObject(hBMP);

}//if

程序截图1 在进行光照和材质相关的计算时,需要先进行必要设置操作,我们需要进行如下操作:

{ glClearColor(1.0,1.0,1.0,1.0);voidInitScene()

//设置明暗处理模型 glShadeModel(GL_SMOOTH);//glShadeModel(GL_FLAT);//开启深度测试

glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glClearColor(0.0f,0.0f,0.0f,0.0f);glClearDepth(1.0f);//使光源生效

glEnable(GL_LIGHTING);//设置环境光

GLfloatambientLignt[]={0.8,0.7,0.9,1.0};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLignt);//设置材料属性,自身的反光属性 GLfloatShininess[]={80.0};//镜面强度,白色

GLfloatSpecular[]={1.0,1.0,1.0,1.0};//设置材质颜色属性

GLfloatMatColor[]={0.9,0.9,0.9,1.0};//光源位置

GLfloatPostion[]={1.0,1.0,1.0,0};//具体设置GL_FRONT_AND_BACK

//GL_FLAT

glMaterialfv(GL_FRONT,GL_SPECULAR,Specular);glMaterialfv(GL_FRONT,GL_SHININESS,Shininess);//设置光照模型

glLightfv(GL_LIGHT0,GL_POSITION,Postion);//给光源设置位置*/ glLightfv(GL_LIGHT0,GL_SPECULAR,MatColor);//给镜面光设置颜色 glLightfv(GL_LIGHT0,GL_DIFFUSE,MatColor);//设置漫反射颜色 //开启光照特征 glEnable(GL_LIGHT0);

}//endfnc 4.如下一段程序,运行完成雾化功能,现在有若干空缺,请根据上下文完成填写。

程序截图1 { //Get FPS void DrawScene()if(GetTickCount()-g_dwLastFPS >= 1000)

glClear(GL_COLOR_BUFFER_BIT);glLoadIdentity();//设置位图

glPixelTransferf(GL_RED_SCALE, 1.0);{

g_dwLastFPS = GetTickCount();

char szTitle[256]={0};

sprintf(szTitle, “ Current %d FPS”, g_nFrames);SetWindowText(hwnd, szTitle);g_nFrames = 0;

}//if g_nFrames++;*/ glPixelTransferf(GL_GREEN_SCALE, 0.0);glPixelTransferf(GL_BLUE_SCALE, 0.0);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glEnable(GL_BLEND);glFlush();}//endfnc //初始化操作

五、简答题(共15 分)

关于构建一个立体曲面的程序有如下截图,程序有部分功能空缺,请完成

//渲染场景 void DrawScene(){ //调用显示列表进行渲染

glCallList(drawlist);if(showCPoints){

//禁止纹理

glDisable(GL_TEXTURE_2D);

glColor3f(1.0f,0.0f,0.0f);

for(i=0;i<4;i++){

//绘制控制点

glBegin(GL_LINE_STRIP);for(j=0;j<4;j++){ glVertex3d(pCtrData[i][j].x, pCtrData[i][j].y, pCtrData[i][j].z);

}//for glEnd();}//for for(i=0;i<4;i++){

glBegin(GL_LINE_STRIP);for(j=0;j<4;j++)//绘制点

glVertex3d(pCtrData[j][i].x, pCtrData[j][i].y,pCtrData[j][i].z);glEnd();}//for glColor3f(1.0f,1.0f,1.0f);//启用纹理

glEnable(GL_TEXTURE_2D);

}//if glFlush();

}//endfnc

2.关于现实Bezier曲线的一段程序如下,运行截图如下,关于功能现有部分空缺,请完成。

intInitScene(){

glShadeModel(GL_SMOOTH);

glClearColor(1.0f, 1.0f, 1.0f, 0.5f);//设置清空颜色为白色 glClearDepth(1.0f);

//初始化深度缓存最大为 1.0f //开启深度测试 glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//开启求值器

glEnable(GL_MAP1_VERTEX_3);//设置控制点的类型,起始位置从0-100,控制点数目为4,跨度为3 //点的存储数组为B_Points[4][3]

} glMap1f(GL_MAP1_VERTEX_3,0.0f, 100.0f, 3,//起始 //终止范围

//点数目 iNumPoint,&B_Points[0][0]);//均匀分布网格,有100个单位,从u1到u2 glMapGrid1d(100,0.0,100);return TRUE;

boolDrawScene(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0,0,-20.0f);inti;//设置点的尺寸大小为 10 glPointSize(10);//设置控制点为红色 glColor3f(1.0,0.0,0.0);glBegin(GL_POINTS);

for(i=0;i

{ glVertex2fv(B_Points[i]);}//for glEnd();return true;

}//DrawScene 3.关于实现光照效果对比的程序。左图为加光照,右边为未加光照。部分功能空缺,请完成

void DrawScene(){ GLfloat spotPostion[]={0.0,0.0,1.0,1.0};

//清空缓冲区

glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);glLoadIdentity();

glPushMatrix();glColor3f(1.0,0.0,0.0);glRotatef(fRot, 1.0f, 0.0f, 0.0f);//使用灯光

glLightfv(GL_LIGHT2,GL_POSITION,spotPostion);glLightfv(GL_LIGHT2,GL_SPOT_DIRECTION,spotDir);glTranslatef(spotPostion[0],spotPostion[1],spotPostion[2]);glutSolidCone(0.05f,3.0f,15,15);glPopMatrix();glTranslatef(0,0,-6.0);//glRotatef(fRot,1,0,0);//绕y轴旋转60° glRotatef(60,0,1,0);//属性堆栈压栈

// glPushAttrib(GL_LIGHTING_BIT);// glDisable(GL_LIGHTING);

glColor3f(1.0f,1.0f,1.0f);glBegin(GL_TRIANGLES);//计算法线一

calNormal(vTrangle1,vector);glNormal3fv(vector);

注:本文为网友上传,旨在传播知识,不代表本站观点,与本站立场无关。若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:66553826@qq.com

上一篇:编程型游戏——一类特殊的教育游戏 下一篇:EFL教学