3D max中,可编辑多边形中“利用所选3d立体图形怎么制作创建3d立体图形怎么制作”创建出来的线条不能用挤出命令;

Flare3D 是一款功能强大的引擎它使得 Flash Φ的 3D 内容管理变得更为简便。 它的设计宗旨是提供一个完美的开发工作流程以便你能够获得事半功倍的效果。

本教程侧重讨论在 Flash 中创建 3D 遊戏所需的 ActionScript 代码;但本范例项目不包括创建和导出游戏组件文件的过程

在完成本教程之后,你将了解在Flash中开发一个完整 3D 游戏所需的基本概念 在本范例中,你将使用 Stage3D 和 Flare3D 处理用于创建一个名称为 Yellow Planet 的游戏的文件(参见图1)

一旦 scene 完成加载,你可以访问所有包含的对象 你可以使用方法 getChildByName("object_name") 获取里面所有的对象。 该方法能够在层级中以递归的方式进行搜寻直到它找到需要的对象。 如果没有找到任何对象则方法返囙 null。

例如你可以通过使用下行代码从天空(sky)对象中获取一个引用:

如果你希望修改一个特定对象的所有子对象,则你可以使用 forEach 方法 forEach 方法将为特定对象的每个子对象调用一个函数。

例如查看一下下面代码:

在上面的代码行中,setupScene 是一个将每个子对象作为参数接收的方法

查看一下下面的代码范例:

你可以通过使用 Update 事件控制 scene 的更新时间。 该事件是在渲染之前下发的因此你可以在每次调用该方法时修改 scene。 updateEvent 函数是该游戏中的主循环

在本范例中,updateEvent 将控制风扇(fan)和天空(sky)的旋转方式:

在影片剪辑播放过程中注意一下你可以利用你的鼠标迻动控制行星的旋转。 在你观看风扇旋转过程中思考一下 updateEvent 函数以及如何在行星内部修改它的对象。 在你完成查看范例项目之后请继续閱读下一节内容。

下面你将研究如何利用 Flare3D 控制相机。 此外你还将学习一些基本的相机操作理念。 目前你可以使用许多不同的策略来控制相机的位置。 本节将介绍两个能够简化这一过程的用于 3D 游戏的函数

目前,这一步骤看起来似乎没有必要 但在将来,它在必要时能夠便于更好地控制 astronaut

查看下列代码,以便了解如何更好地控制 astronaut 的显示:

在本范例项目游戏中宇航员可以在行星上行走。 因此相机必须能够跟踪他。 通过引用宇航员的当前位置可以现实这一相机行为 你可以使用 setPositionWithReference 来完成这一任务。 这一方法包含于Pivot3DUtils 之中而且它允许你确定┅个对象与用作引用的另一个对象之间的相对位置。 这意味着你可以对任一与其它对象相关的对象进行转换

在本游戏中,相机总是位于宇航员之后 它可以保持与宇航员的相对位置。 相机(与其它在 scene 中的对象一样)具有一个定义其位置和方向的坐标轴 坐标轴的方向如图 5 所示。

图5. 对象的坐标轴方向

+Z 指向宇航员的方向而 +Y 指向正上方。 这些矢量被分别称为 Up、Dir 和 Right(参见图6)

假定每个对象具有其自己的坐标轴,下面的代码行将相机相对于宇航员的位置设置为 up (+Y) 80 单位 away (-Z) 20 单位:

正如你看到的那样通过使用 Flare3D 和一个单行代码即可解决一个复杂的任务。

在楿机处于正确的位置之后镜头需要对准正确的方向。 使用与通过参考点设置对象的位置相同的策略你也可以使用参考点寻找游戏中的特定点。

这一方法具有一个名称为 'up' 的附加和可选参数它是本游戏必需的参数。

通常Up 矢量总是指向正上方。 在许多情形下传递一个 null 值即可使得 Flare3D 为你计算该矢量的值(参见图7)。

图7. 控制相机的方位

然而设想下面的范例:如果你抬起你的手并且利用你的食指指向一个对象,就像一把手一样则你的拇指将自动指向正上方,这是我们期望的结果 此时已经定义了 Dir 和 Up 矢量。

现在在你仍然将食指指向相同对象嘚同时,试图旋转你的手 在它旋转的过程中,Up 手指(你的拇指)开始改变其方向 注意,即使你总是保持你的手指向相同方向但在你旋转你的手的过程中,Up 矢量将会移动 为了对相机进行编程,以便它能够知道哪个方向是正上方你需要使用 up 参数。

在本范例游戏中相機位于宇航员的上方。 相机必须设置为指向下方以便能够朝向宇航员。 相机的 Up 矢量应该指向宇航员的 Dir 矢量(参见图8)

图 8. 当 Up 矢量改变时,相机的方位也将随着改变

在本节中你将学习一些用于将互动性引入到游戏的概念。

首先让我们探讨一下游戏如何管理用户的输入。 Flare3D 包含一些你可以使用的工具它们能够在游戏播放过程中快速地管理键盘和鼠标输入信息。

在该类中Input3D.keyDown() 方法可以用于检测按下的键。 该方法在按下一个键时将返回一个 true 值

本范例项目中的另一个值得研究的有趣概念是光线的使用。

光线是虚拟的并且长度无限它可以从任一點开始沿着某个方向无限延伸。

在无限延伸之前光线能够测试游戏中的一个对象是否相交。 如果测试的结果是可靠的则光线将提供关於碰撞的附加信息,其中包括 mesh、碰撞的确切点、被碰撞面部的法线等信息

本范例项目将使用光线效果,因为宇航员在保持与球形地面对齊的同时需要不断地在球形地面上奔跑 光线用于完成两个任务(参见图9)。

图9. 光线能够将宇航员角色与 3D 环境的地面对齐

在本例中环境嘚 stage 基本上是一个球体。 如有必要你可以使用其它方法让宇航员保持与该球体对齐,但光线的作用很大因为它们能够用于不均匀的表面。

下面代码将添加行星的地面以便利用光线测试碰撞效果:

第二个参数("false")表示只能利用地面检测碰撞(丢弃地面的 child)

通过在光线起始嘚位置设置一个点开始测试。 这一位置应该不会与宇航员的位置完全一致因为它与地面如此靠近,以致光线无法与任何物体相交 相反,设置一个位置稍高的点例如 (0,100,0),然后使用 localToGlobal 将该点转换为世界坐标(world coordinate)

在定义光线起始点之后,下一个任务是为它提供方向 该方向应該向下指向宇航员的方向。 你可以使用 Pivot3D 的 getDown() 方法获取该矢量

在上节中,你已经了解如何测试何时光线碰撞返回 true 值 光线碰撞信息已经可用並且你可以将它用于游戏逻辑。 该信息是以特定的结构储存的 你可以使用 CollisionInfo 对象来解析收到的信息。 在下面代码中注意一下你如何才能獲取位置 (info.point.x、info.point.y、info.point.z) 和标准方位

SphereCollision 是一款用于处理复杂几何3d立体图形怎么制作碰撞的工具。 它本质上是一个与一个或多个 mesh 对象碰撞和相互作用的虚擬球体(参见图10)

本范例游戏使用 SphereCollisions 以便使得宇航员能够与行星周围的墙和障碍物碰撞。 通过使用 SphereCollision你可以将宇航员包裹于虚拟球体之后鉯便与游戏环境碰撞。

此外该 SphereCollision 工具在碰撞发生时还能够提供一段平滑的位移,这一情形被称为滑块(slider)

  1. 创建一个 SphereCollision 实例,然后将球体目標和一个半径值传递给它
  2. 在碰撞发生之后,你可以根据需要访问和使用相应的碰撞信息

注: RayCollision 和 SphereCollision 均是计算强度很大的数学算法,因此最恏尽可能与较少多边形对象一起使用 由于这些工具需要完成如此复杂的数学公式计算,所以你必须注意到在以调试模式或发布模式下运荇项目时存在的显著性能差异 此外,SphereCollision 不能处理缩放的对象因此在游戏中处理它们之前,必须对你的碰撞对象进行标准化处理

首先,必须声明相应的碰撞对象如下所示:

在默认情形下,虚拟球体将位于坐标轴的中心 在本范例中,宇航员的坐标是在他的脚上因此你需要为虚拟球体提供一个偏移量,它是位于 (0,3,0) 的第三个 Vector3D 参数如图11所示。

如果你记得步骤 3 的"查看宇航员(Astronaut)容器"你知道宇航员角色是包裹於一个容器之中的。 现在该是说明原因的时候了。 宇航员具有跳跃的能力 因此,在某些情形下该角色能够跳过风扇以避免一次必然嘚死亡。 但宇航员不一定能够跳过大楼等障碍物 此时,你可以检测到宇航员和障碍物之间的碰撞 如果宇航员跳过障碍物,则绝不会下發碰撞事件 因此,SphereCollision 将被添加到容器中而不是宇航员。 之后当宇航员跳起时,球体仍然处于底部并且能够检测到碰撞事件(参见图12)

图12. 当宇航员跳起时,SphereCollision 仍然在容器中保持不变以便允许利用其它元素进行碰撞检测—即使该角色位于元素之上

一旦创建相应的碰撞你必須指定需要核查的对象。 在本范例游戏中这些对象(Pivot3D 对象)的每个对象均被称为 "obstacle",因此你需要为每个对象添加一个碰撞事件

一旦你移動宇航员,所有的碰撞事件均被测试 updateEvent() 函数包含下面代码行:

如果宇航员与一个障碍物发生碰撞,则该方法将产生一段位移以便确定相应嘚交点并且将宇航员重新定位到 scene 的正确位置 这样可以避免出现导致宇航员被粘连在一个单一位置以及看似被冻结在 scene 中的问题。

现在是添加一些好看的特殊效果的时候了(参见图13)

图13. 粒子效果能够将设计美学添加到游戏的外观

粒子允许你同时快速地绘制大量数据。 当你创建效果时你可以将所有粒子进行分组并且在一次绘制调用中将它们全部绘制出来,以避免单独绘制每个粒子 正如你能够想象的那样,這一策略能够提升绘图速度因为粒子与其它 3D 对象的工作方式有点不同,并且粒子通常面向相机

按照下列步骤在 3D Flash 游戏中使用粒子:

  1. 覆盖方法 init,更新并且克隆 Particle3D 类以便将期望的行为添加到相应的粒子中
  2. 创建一个 ParticleMaterial3D 类以便设置与粒子兼容的纹理、颜色或其它过滤器。

在本范例中新的发射器(emitter)是在由 ParticleEmiter3D 类扩展而来的独立类中创建的,以便代码更加简洁并且易于更新

你可以按照使用 FireEmiter 的相同方式使用 SmokeEmiter。 在本范例游戲中SmokeEmiter 与位于行星上的每个风扇是对应的。

注意 SmokeEmiter 类将风扇方向用作每个发射器的方向:

本节描述的概念与开发任何其它 Flash 游戏使用的概念类姒 在本步骤中,我们的目的是让宇航员能够跳过 Y 轴

由于宇航员位于容器对象的内部,所以无论容器的方位如何变化均无关紧要 宇航員总是沿着其自己的 Y 轴上下移动。

在完成这一步骤之后你需要更新游戏的逻辑。 为了管理游戏播放的流程添加一些状态变量非常必要。 此外你必须添加函数 gameLogics 以便在播放游戏过程中更新所有游戏状态。

添加下列给出的代码以便实现一些游戏逻辑 为了控制宇航员角色的荇为,你需要保存角色的状态 此外,为了控制宇航员的动量你必须添加一个名称为 jumpValue 的新变量。

在每次 Update 重复操作时均调用 gamesLogic 方法 gamesLogic 方法能夠核查宇航员的状态。 如有必要你可以修改游戏行为以改变其工作方式。 例如如果用户按下 Space 键,则它将激活 FireEmiter 并且更新角色的动画效果 下面是一个范例:

现在,游戏的确变得赏心悦目 你已经进入了添加有趣部件的阶段以便使得游戏变得更加引人入胜。 在本节中你将添加能够允许宇航员角色杀死敌人、死亡和飞行的代码。

这些均是能够为游戏带来生气的冒险和诱惑理念 你将会继续使用相应的游戏逻輯不断地将新的功能融合到游戏中。

此刻也是将控制风扇和地雷的行为移植到一个名称为 gameObjects 的新函数的时候了

在游戏逻辑变量中创建一个噺游戏变量,将其命名为 shakeFactor:

在宇航员死亡时你将使用 shakeFactor 变量摇晃相机并且生成一种特殊效果。

gameObjects 的行为与 gameLogics 类似因为在每次 Update 重复操作时均调鼡 gameObjects 方法。 该函数通过比较宇航员角色和 scene 中其它元素之间的距离获取宇航员的当前位置并且更新游戏状态

如果宇航员与风扇之间的距离小於风扇的半径,则游戏的状态被更改为 "fan" 并且在下次调用 gameLogics 方法时宇航员将被发射到太空(参见图14)

图 14. 如果宇航员离风扇太近,则将会导致宇航员飞入太空

如果宇航员与地雷之间的距离小于10个单位则游戏逻辑使用状态变量的值来设置一个具有下面两种可能的结果:

  • State = "jump" – 结果是宇航员跃过地雷并且地雷被摧毁。
  • State = "run" – 结果是宇航员与地雷相撞并且宇航员死亡(参见图15)

图15. 如果宇航员在运行状态时与地雷相撞,则宇航员死亡

每次地雷被摧毁时它将被重新安置到行星的另一侧。 之后必须重新激活它。

为了检测地雷是否位于行星的另一侧你可以将烸个地雷的 Up 矢量与宇航员的当前Up矢量进行比较。 如果你使用 dotProduct 将这两个矢量相乘并且它们均指向相同的方向,则结果是一个正的数值这表示宇航员和地雷均位于行星的同一侧。 如果比较之后计算出两个矢量指向不同方向则结果是一个负值,因为地雷的位置与宇航员的位置相距很远(参见图16)

图16. 将 A 与 B 相乘得出一个正值;如果将 A 与 C 相乘,你将得出一个负值这表示地雷位于行星的另一侧

声音和 2D 对象的添加為游戏增添了引人入胜的新外观,因此使得游戏玩起来更赏心悦目

你可以使用许多不同的方法将 Flash 内容带入游戏。 在本范例中为了保持簡洁,你可以通过将你的游戏部件作为组件导出(SWC 文件)

按照下列步骤将一个 FLA 文件作为一个组件导出:

  1. 打开一个 Flash 文件,然后使用 Property inspector 将链接名稱设置为你希望导出的对象和影片

在导出 SWC 文件之后,你可以将相应的库添加到你的项目中然后使用其中包含的组件创建它们新的实例。

这部分过程与处理基本影片剪辑符号和声音非常相似

范例游戏的 2D 界面包含于 assets.swc 文件。 你可以使用下列代码为该对象创建一个实例:

与3d立體图形怎么制作用户界面元素互动

在用户玩游戏的过程中需要跟踪三种不同的分数。 用户的个人游戏点数(game points)、对象收集的能量数(number of energy)囷总体最高分数(overall highest score)均可以计算和跟踪以便于在游戏界面上显示出来。 相应的分数信息可以在 gameGUI() 函数中更新 该函数能够修改 2D UI 元素中的文夲字符以便显示当前游戏信息(参见图17)。

图17. 游戏界面显示用户的分数以及能量点数

游戏包含当宇航员死亡或摧毁地雷时显示的信息 这些信息也是由 2D 3d立体图形怎么制作元素构成的(参见图18)。

图18. 当地雷被摧毁或宇航员死亡时3d立体图形怎么制作元素能够为用户提供报警信息

核查一下下面的代码,看看信息是如何放置于 scene 的正确位置在此我们使用宇航员的位置作为参考位置。

本游戏的目标是在宇航员在行星仩行走时收集宇航员发现的能量条目 当用户收集到 3 个能量条目时,它们将被提升到游戏的下一级别并且宇航员的速度将会增大(参见图19)

图19. 宇航员在躲避地雷的同时收集能量条目以便玩赢游戏

能量条目是存储于 energy.f3d 文件中的一个外部 3D 模型。 为了将能量条目添加到游戏中你應该加载 F3D 文件并且将它添加到 scene 中,就像前面添加其它 Flare3D 元素一样

每次宇航员发现一个能量条目之后,将生成一个全新的能量条目并且放置於行星的一个随机位置 新的能量条目的位置是通过随机计算得出的,如下所示:

更多能量 = 更高速度

每次宇航员发现一个新的能量条目之後他的速度将会提升:

当宇航员连续获取 3 个能量条目时,他将在一小段时间内暂时不能移动并且游戏将显示 "Next Level" 告警提示信息 在此之后,遊戏的状态将返回到 "run" 这一类型的附加细节信息将为游戏增添兴奋场面,并且提供更为赏心悦目的用户体验

名称为 Yellow Planet 的 3D Flash 游戏将作为教程游戲包含于正式的 Flare3D 版本中。 你可以使用该范例项目组件来研究 Flare3D 的运行机制 在本教程中,你已经学习了与开发游戏相关的主要任务

希望这┅简介已经激发你使用 Flare3D 技术开发你自己的 Flash 游戏并且充分利用 Flash Player 11 引入的新功能。

如需获取关于使用 Flare3D 的更多信息请访问 。

此外请务必查看  寻找各种有用的文章、教程和范例项目以便让你能够迅速地展开工作。

}

我要回帖

更多关于 3d立体图形怎么制作 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信