Flash基础理论课 第十五章 3D基础Ⅱ

返回“Flash基础理论课 - 目录”

Z排序

在添加了多个物体后代码中显现出了一个新问题——称为z排序。Z排序就像它的名字一样:物体如何在z轴上进行排序,或者说哪个物体在前面。由于物体都使用纯色,所以看起来不是很明显。为了让效果更加明显,请将 Ball3D的 init方法改为以下代码,并运行刚才那个程序:

public function init():void {
 graphics.lineStyle(0);
 graphics.beginFill(color);
 graphics.drawCircle(0, 0, radius);
 graphics.endFill();
}

通过给小球添加轮廓线,我们就可以看出哪个小球在前面了。这几乎毁掉了整个3D效果,因为现在较小的物体出现在了较大物体的前面。Z排序就是用来解决这个问题的,但不是自动的。Flash 不知道我们在模拟 3D。它只知道我们在移动和缩放影片。它也不知道我们到底是使用左手还是右手坐标系。在小球远离时应该将这个小球放在相邻小球的后面。Flash 只根据在显示列表中的相对索引进行排序。在AS 2中,z排序只需要改变影片剪辑的深度即可完成。swapDepths(深度)。深度较高的影片剪辑出现在深度较低的影片的前面。然而在AS 3中,操作会稍微有些复杂。对于显示列表没有可以任意修改的深度值。显示列表的作用更像是与个数组。列表中的每个显示对象都有一个索引。索引从 0 开始,直到列表中所有对象的个数。例如,假设在类中加入三个影片 A, B, C。它们的索引应该是0, 1, 2。无法将其中的一个影片的索引设置为100,或 -100。如果已经删除了B影片,那么这时 A和C影片的索引应该是0和1。明白了吧,在显示列表中永远没有“空间”这个概念。

根据深度,索引 0 是最低的,任何深度较高的显示对象都将出现在这个较低对象的前面。我们可以用几种不同的方法来改变物体的深度:

■ setChildIndex(child:DisplayObject, index:int) 给对象指定索引值(index)。

■ swapChildren(child1:DisplayObject, child2:DisplayObject) 交换两个指定的对象。

■ swapChildrenAt(index1:int, index2:int) 交换两个指定的深度。

使用setChildIndex 是最简单的。因为我们已经有了一个balls 数组。可以根据小球的 z轴深度从高到低来排序这个数组,然后从 balls的 0(最远的) 到 49(最近的)为每个小球设置索引。请看下面这段代码:

private function sortZ():void {
 balls.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
 for (var i:uint = 0; i < numBalls; i++) {
  var ball:Ball3D = balls[i];
  setChildIndex(ball, i);
 }
}

根据数组中每个对象的 zpos属性对该数组进行排序。因为指定了数组的 DESCENDING和Array.NUMERIC,则是按数值大小反向排序的——换句话讲,就是从高到低。结果会使最远的小球(zpos 值最高的)将成为数组中的第一个,最近的将成为最后一个。

然后循环这个数组,将每个小球在显示列表中的索引值设置为与当前在数组中的索引值相同。

将这个方法放入类中,只需要在小球移动后调用它即可,将函数调用放在onEnterFrame方法的最后:

private function onEnterFrame(event:Event):void {
 for (var i:uint = 0; i < numBalls; i++) {
  var ball:Ball3D = balls[i];
  move(ball);
 }
 sortZ();
}

剩下的代码与上一个例子中的相同。全部代码可在Zsort.as中找到。

时间: 2024-08-29 03:55:42

Flash基础理论课 第十五章 3D基础Ⅱ的相关文章

Flash基础理论课 第十五章 3D基础Ⅰ

返回"Flash基础理论课 - 目录" 前面我们做的一切都是二维的(有时只有一维),但是已经可以做出非常酷的东东了.现在,将它们带入到下一个等级. 创建 3D 图形总是那么另人兴奋.新加入的这个维度似乎将物体真正地带入到了生活中.如何在Flash 中实现 3D 在无数的书籍和教学软件中都有介绍.但是我不打算跳过这些内容,我们会很快地将所有基础的知识讲完.随后,将前面章节中讨论的运动效果放到三维空间中.说得详细些,将给大家介绍速度,加速度,摩擦力,反弹,屏幕环绕,缓动,弹性运动,坐标旋转

Flash基础理论课 第十五章 3D基础 Ⅲ

返回"Flash基础理论课 - 目录" 缓动与弹性运动 在3D中的缓动与弹性运动不会比2D中的难多少(第八章的课题).我们只需要为z轴再加入一至两个变量. 缓动 对于缓动的介绍不算很多.在2D中,我们用tx和ty最为目标点.现在只需要再在z轴上加入tz.每帧计算物体每个轴到目标点的距离,并移动一段距离. 让我们来看一个简单的例子,让物体缓动运动到随机的目标点,到达该点后,再选出另一个目标并让物体移动过去.注意后面两个例子,我们又回到了 Ball3D 这个类上.以下是代码(可以在Easi

Flash基础理论课 第十六章 3D线条与填充Ⅰ

返回"Flash基础理论课 - 目录" 第十五章我们介绍了3D,但只是将物体置于3D空间中,设置大小与位置.物体实际上还是2D的.这就像老的3D游戏中,我们可以绕着某个物体或人物走,这些对象会转过来面对我们.这些物体或人物并不是真正的会转过来 -- 只是看上去是这样的,因为它们都是2D 物体,那是我们看到它唯一的一个视角. 本章,我们将真正地在 Flash中创建3D 模型.具体说来有创建并使用3D 点,线条,填充以及立体图形.学习完本章,大家就可以任意在三维空间中创建各种形状,并对它们

Flash基础理论课 第十六章 3D线条与填充 Ⅲ

返回"Flash基础理论课 - 目录" 建立其它形状的模型 恭喜各位!您已经掌握了旋转立方体.现在我们可以去建立所有种类的形状了.只要先将它们绘制在方格纸上,标出点和三角形,再将放入数组即可.这张图可以帮助我们用几种视角绘出物体,旋转后可以看到每个面以及在三角形上标出的点.本节提供了一些其它的图形作为起点. 金字塔形 下面是3D 金字塔形的代码(可以在Pyramid.as中找到).首先是点: points[0] = new Point3D( 0, -200, 0); points[1]

Flash基础理论课 第十六章 3D线条与填充Ⅱ

返回"Flash基础理论课 - 目录" 运用三角形 运用三角形有许多好处--或许比我知道的还多,我们这里只做简单的介绍介绍.首先,运用三角形我们能够确定多边形的所有顶点都在一个平面上,因为一个三角形定义一个平面.如果大家还不确定为什么它很重要,那么我们就拿字母 E 的例子来说,随机地改变一些点的 z 值.这时可能会得到一些有趣的结果,这些结果也很快会变成不可预想或不可预知的. 其次,使用三角形,在绘制复杂的形状时,可能会很简单.例如,考虑一下图 16-8. 图16-8 更加复杂的 3D

Flash基础理论课 第十四章 反向运动学:拖拽与伸展Ⅰ

返回"Flash基础理论课 - 目录" 第十三章介绍了一些基础的运动学以及正向与反向运动学之间的区别.前一章我们讲了正向运动学,本章就要学习与它关系紧密的反向运动学.涉及到的动作就是拖拽与伸展. 与正向运动学的例子相同,本章的例子也是从独立的关节开始建立系统.我们从单个关节开始,然后到多个关节.首先,我会给大家演示最简单的计算角度与位置的方法.只是在代码中使用基本的三角学进行大概的测算.最后,会给大家简要地介绍使用余弦定理的方法,这样计算出来的结果更加准确,但会消耗大量的计算--这就是

Flash基础理论课 第十九章 实用技巧 Ⅲ

返回"Flash基础理论课 - 目录" 实用公式 统领全书,我们已经有了各种运动和效果的公式.我已经提取出了最实用和最常用的公式.方程.以及代码的摘录,并将它们列在本章的最后.我认为将它们放到同一个地方应该对大家非常有帮助,因此我将这些我认为最需要的内容放到一起作为整体的一个参考资料.我将会在这一页夹上书签. 第三章 基础三角函数的计算: 角的正弦值 = 对边 / 斜边 角的余弦值 = 邻边 / 斜边 角的正切值 = 对边 / 邻边 弧度转换为角度以及角度转换为弧度: 弧度 = 角度

Flash基础理论课 第十九章 实用技巧 Ⅰ

返回"Flash基础理论课 - 目录" 现在您已经来到了最后一章.我将所有想要介绍的一些小东西都放在了这一章,它们不太合适放在其它地方,或者说与前面章节的主线有些脱离. 本章,我还重组了前面每章课后列出的公式,因此可以当作这些公式的一个参考点. 由于这些课题都是比较零碎的概念,所以我没有办法将这些许许多多的内容组织起来.因此每一节都是一个独立的单元.好了,不多说了,让我们开始吧. 布朗(随机)运动 先讲讲历史.一天,一个名叫罗伯特-布朗(Robert Brown)的植物学家正在观察一滴

Flash基础理论课 第十二章 粒子引力与万有引力Ⅰ

返回"Flash基础理论课 - 目录" 很高兴到晋级到了这一章.前面的章节总体来说都是些交互的运动.先让物体运动起来,再让物体与环境产生交互,随后与用户交互,最后是物体之间的交互.本章将详细地为大家介绍物体之间的交互,并带有一定距离的.说具体些,我们将学习粒子,重力(与前面有些不同),弹性运动(还是它!)以及大名鼎鼎的Node Garden.让我们开始吧! 粒子(Particles) 说明一下我们所指的粒子是什么意思.出于本章的目的,粒子只就是一个独立的单位,通常会伴有着几个(或多个)