Fixed an ArrayIndexOutOfBound in animationFactory

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9246 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
rem..om 13 years ago
parent 07e96d02eb
commit 94e0937bb6
  1. 52
      engine/src/core/com/jme3/animation/AnimationFactory.java

@ -276,32 +276,34 @@ public class AnimationFactory {
// if the delta of euler angles is higher than PI, we create intermediate keyframes // if the delta of euler angles is higher than PI, we create intermediate keyframes
// since we are using quaternions and slerp for rotation interpolation, we cannot interpolate over an angle higher than PI // since we are using quaternions and slerp for rotation interpolation, we cannot interpolate over an angle higher than PI
int prev = getPreviousKeyFrame(keyFrameIndex, keyFramesRotation); int prev = getPreviousKeyFrame(keyFrameIndex, keyFramesRotation);
//previous rotation keyframe if (prev != -1) {
Rotation prevRot = keyFramesRotation[prev]; //previous rotation keyframe
//the maximum delta angle (x,y or z) Rotation prevRot = keyFramesRotation[prev];
float delta = Math.max(Math.abs(x - prevRot.eulerAngles.x), Math.abs(y - prevRot.eulerAngles.y)); //the maximum delta angle (x,y or z)
delta = Math.max(delta, Math.abs(z - prevRot.eulerAngles.z)); float delta = Math.max(Math.abs(x - prevRot.eulerAngles.x), Math.abs(y - prevRot.eulerAngles.y));
//if delta > PI we have to create intermediates key frames delta = Math.max(delta, Math.abs(z - prevRot.eulerAngles.z));
if (delta >= FastMath.PI) { //if delta > PI we have to create intermediates key frames
//frames delta if (delta >= FastMath.PI) {
int dF = keyFrameIndex - prev; //frames delta
//angle per frame for x,y ,z int dF = keyFrameIndex - prev;
float dXAngle = (x - prevRot.eulerAngles.x) / (float) dF; //angle per frame for x,y ,z
float dYAngle = (y - prevRot.eulerAngles.y) / (float) dF; float dXAngle = (x - prevRot.eulerAngles.x) / (float) dF;
float dZAngle = (z - prevRot.eulerAngles.z) / (float) dF; float dYAngle = (y - prevRot.eulerAngles.y) / (float) dF;
float dZAngle = (z - prevRot.eulerAngles.z) / (float) dF;
// the keyFrame step
int keyStep = (int) (((float) (dF)) / delta * (float) EULER_STEP); // the keyFrame step
// the current keyFrame int keyStep = (int) (((float) (dF)) / delta * (float) EULER_STEP);
int cursor = prev + keyStep; // the current keyFrame
while (cursor < keyFrameIndex) { int cursor = prev + keyStep;
//for each step we create a new rotation by interpolating the angles while (cursor < keyFrameIndex) {
Rotation dr = getRotationForFrame(cursor); //for each step we create a new rotation by interpolating the angles
dr.masterKeyFrame = keyFrameIndex; Rotation dr = getRotationForFrame(cursor);
dr.set(prevRot.eulerAngles.x + cursor * dXAngle, prevRot.eulerAngles.y + cursor * dYAngle, prevRot.eulerAngles.z + cursor * dZAngle); dr.masterKeyFrame = keyFrameIndex;
cursor += keyStep; dr.set(prevRot.eulerAngles.x + cursor * dXAngle, prevRot.eulerAngles.y + cursor * dYAngle, prevRot.eulerAngles.z + cursor * dZAngle);
} cursor += keyStep;
}
}
} }
} }

Loading…
Cancel
Save