< Zurück | Inhalt | Weiter >

13.4 StretchBehavior

StretchBehavior implements a more complex behavior. The behavior modifies the coordinates within a GeometryArray based on simulated forces applied to the geometric model. Forces are modeled as springs from the origin to every vertex. Every vertex has a mass and an applied force, and hence an acceleration.

Pressing a key will increase the acceleration at each vertex, upsetting the force equilibrium at vertices. The model will then start to oscillate in size under the influence of the springs. Because there are variations in mass between vertices, the model will distort slightly as it oscillates—the heavier vertices displacing less than

the lighter ones. A damping effect is modeled by losing a portion of the vertex acceleration after each iteration. See figure 13.3.


image


Figure 13.3 The StretchBehavior: Frame 1, the original Shape3D; frames 2–4, the vertices within the Shape3D’s geometry are oscillating as the vertices are affected by the springs from each vertex to the origin. The model is a Sphere primitive with an applied texture image. The Sphere was created with a resolution value of 32


NOTE This is a computationally expensive behavior.

StretchBehavior responds to two WakeUp conditions: after every frame and after a key press. The

WakeUp conditions for the behavior are specified as follows:


//create the WakeupCriterion for the behavior WakeupCriterion criterionArray[] = new WakeupCriterion[2];

criterionArray[0] = new WakeupOnAWTEvent( KeyEvent.KEY_PRESSED ); criterionArray[1] = new WakeupOnElapsedFrames( 1 );


//save the WakeupCriterion for the behavior m_WakeupCondition = new WakeupOr( criterionArray );


As usual, the WakeupCriterion is passed to the behavior inside the initialize method:


public void initialize()

{

//apply the initial WakeupCriterion wakeupOn( m_WakeupCondition );

}


The processStimulus method of the behavior, which is called on every frame and in response to a key press, performs all the basic physics calculations and updates the positions of the coordinates within the GeometryArray.


 

From StretchBehavior.java