- 最后登录
- 2013-6-5
- 注册时间
- 2011-7-16
- 阅读权限
- 90
- 积分
- 6011
- 纳金币
- 5996
- 精华
- 1
|
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); |
|