time += timer.getTimePerFrame();
if (time > ColladaManualAnimationExample.UPDATE_RATE) {
time -= ColladaManualAnimationExample.UPDATE_RATE;
final List<SkinData> skinDataList = colladaStorage.getSkins();
final SkinData skinData = skinDataList.get(0);
final SkeletonPose pose = skinData.getPose();
final double time = timer.getTimeInSeconds();
ballSphere.setTranslation(Math.sin(time) * 5, Math.cos(time) * 5 + 10, 5);
final ReadOnlyVector3 ballPos = ballSphere.getTranslation();
// Neck
targetJoint(pose, 13, Vector3.UNIT_Z, ballPos, 1.0);
// Right arm
targetJoint(pose, 10, new Vector3(-1, 0, 0), ballPos, 0.4);
targetJoint(pose, 11, new Vector3(-1, 0, 0), ballPos, 0.6);
targetJoint(pose, 12, new Vector3(-1, 0, 0), ballPos, 0.5);
// Left arm
targetJoint(pose, 7, new Vector3(1, 0, 0), ballPos, 0.15);
targetJoint(pose, 8, new Vector3(1, 0, 0), ballPos, 0.15);
// Waist
targetJoint(pose, 5, new Vector3(0, 1, 0), ballPos, 0.1);
pose.updateTransforms();
if (ColladaManualAnimationExample.UPDATE_BOUNDS) {
final List<SkinnedMesh> skins = skinData.getSkins();
for (final SkinnedMesh skinnedMesh : skins) {
skinnedMesh.updateModelBound();