纳金网

标题: Java3D探奇(七)——行为和插入器(interpolator) [打印本页]

作者: Mr.cai    时间: 2011-8-5 11:50
标题: Java3D探奇(七)——行为和插入器(interpolator)
Behavior 类



行为允许您使场景元素动起来并同场景图交互。Behavior 类为您的代码提供了一种修改场景图的机制。Behavior 位于场景图中并由刺激,例如鼠标运动,触发。

和光一样,行为有界限和能力位,并且必须被附加到场景图上。因此,如果您的行为没有起作用,请确保界限足够大,以便启用了行为并将行为附加到场景图中。

插入器提供了一种将简单动画添加到场景图中的方法。插入器玩起来可以很有趣,并且我们将在我们的示例中使用它们。但是,首先我们将看一些 Behavior 处理的基本内容。



唤醒调用



通过 WakeupCriterion 指定触发行为的条件。唤醒条件的示例包括按键、鼠标事件、定时器以及已播放的帧的数目。在最初创建行为以及每次处理行为消息时指定条件。OrbitBehavior 是一个由鼠标事件唤醒的 Behavior 示例。

通过使用 WakeupOnElapsedTime,可以改变 TranformGroup 的 Transform3D 来使得场景图的一部分动起来。


processStimulus() 方法


当唤醒事件发生时,将调用行为的 processStimulus() 方法。您可以在 processStimulus() 方法中做任何事情 ― 可以从场景中添加或删除对象,更改变换,更改对象的外观,检测两个对象何时相撞,或者您需要做的任何其它事。

请记住无论您需要在场景图中更改什么事物,都需要设置相关的能力位。例如,要更改 processStimulus() 方法中的 TransformGroup 节点,您需要设置 TransformGroup.ALLOW_TRANSFORM_WRITE 位。



插入器



插入器是内置的,它可以帮助您将简单动画添加到场景图中。它们在您所定义的值的范围内平滑地移动或插入。

随Java 3D SDK 提供的 GearBox 示例使用几个旋转插入器来使下图所示的齿轮动起来。







每一个齿轮都对应一个每隔一定时间就会被重复触发的 RotationInterpolator。RotationInterpolator 对包含齿轮几何对象的 TransformGroup 应用旋转,从而引起该齿轮转动。



全都在计时



Alpha 对象生成一个 0.0 与 1.0 之间的值作为计时之用。(请注意Alpha 对象同顶点的 alpha 值无关,后者指定透明度。)

插入器使用 Alpha 对象来实施它们对场景图的更改。Alpha 对象的值可以随时间而改变,这取决于您如何对其编程。我们的齿轮以匀速连续不停地旋转。每当 Alpha 对象触发 RotationInterpolator 时,RotationInterpolator 使用生成的 alpha 值来计算新的旋转(即,使齿轮转动。)通过使用下面的代码,可以创建一个以匀速无限循环的 Alpha:



Alpha(int loopCount, long speed)



有大量的选项用于更改 Alpha 对象的行为。您可以对其加速,停一段时间,然后慢慢地使其停下来。


旋转示例



创建一个 Sphere ,然后将地图材质应用于其上。(地球看起来有些模糊,因为用作材质的地图不详尽。)我在 RotationInterpolator 中设置了一个 TransformGroup,然后将用材质处理过的 Sphere 附加到 TransformGroup 之下。当 Interpolator 改变 TransformGroup 时,地球开始旋转。因为 Interpolator 在渲染循环开始之后更改了场景图中的值,所以我们必须设置一个能力位:



spinGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE)



在这一示例中,我将 Alpha 对象配置成加速顺时针旋转,然后反过来逆时针旋转。







颜色插入器


对于ColorInterp.java,我已经添加了代码以将颜色插入器附加到旋转的地球上。它不影响 TransformGroup,而是影响 Material 对象中的散射颜色。因为在渲染循环开始之后,Material 对象将会变化,所以我设置了其能力位。



material.setCapability(Material.ALLOW_COMPONENT_WRITE);

Alpha colorAlpha = new Alpha(-1, 2000);

Color3f endColor = new Color3f(1.0f,1.0f,1.0f);

Color3f startColor = new Color3f(0.0f,0.0f,0.0f);

ColorInterpolator colorInterp =

new ColorInterpolator(colorAlpha, mat,startColor,endColor);

colorInterp.setSchedulingBounds(bounds);
作者: tc    时间: 2011-8-10 17:01
我也来支持下

作者: 奇    时间: 2012-1-19 23:07
年年岁岁,岁岁年年,春去春来,转眼间又过了一年,小年到,祝福到,愿你在新的一年事业节节高,生活红火火,拜个早年,提前祝你新年好!

作者: 奇    时间: 2012-1-21 23:33
年年岁岁,岁岁年年,春去春来,转眼间又过了一年,小年到,祝福到,愿你在新的一年事业节节高,生活红火火,拜个早年,提前祝你新年好!

作者: C.R.CAN    时间: 2012-2-24 23:30
百度的叫度娘,网易的叫易娘,新浪内部还在为是叫新娘还是浪娘而争论不休!……不管你们是企鹅的额娘,豆瓣的伴娘,还是华为的伪娘,都要记得,淘宝才是你们的亲娘啊!亲!!

作者: 晃晃    时间: 2012-4-6 23:33
我来顶个

作者: 奇    时间: 2012-5-5 23:22
我来顶个

作者: 晃晃    时间: 2012-6-16 23:26
读铁系缘分,顶铁系友情

作者: tc    时间: 2012-6-23 23:22
顶!学习了!阅!

作者: C.R.CAN    时间: 2012-6-25 23:26
先垫一块,再说鸟

作者: C.R.CAN    时间: 2012-7-29 23:23
楼主收集的可真全哦

作者: 晃晃    时间: 2013-3-14 23:20
凡系斑竹滴话要听;凡系朋友滴帖要顶

作者: tc    时间: 2013-3-17 23:34
既来之,则看之!





欢迎光临 纳金网 (http://www.narkii.com/club/) Powered by Discuz! X2.5