private void updateSkeleton(SkeletalMeshComponent skeletalMeshComp, MeshAnimationFrame frameA, MeshAnimationFrame frameB, float interpolationVal) { for (int i = 0; i < skeletalMeshComp.animation.getBoneCount(); ++i) { EntityRef boneEntity = skeletalMeshComp.boneEntities.get(skeletalMeshComp.animation.getBoneName(i)); if (boneEntity == null) { continue; } LocationComponent boneLoc = boneEntity.getComponent(LocationComponent.class); if (boneLoc != null) { Vector3f newPos = BaseVector3f.lerp(frameA.getPosition(i), frameB.getPosition(i), interpolationVal); boneLoc.setLocalPosition(newPos); Quat4f newRot = BaseQuat4f.interpolate(frameA.getRotation(i), frameB.getRotation(i), interpolationVal); newRot.normalize(); boneLoc.setLocalRotation(newRot); boneEntity.saveComponent(boneLoc); } } }
public void setToInterpolateState(EntityRef entity, CharacterStateEvent a, CharacterStateEvent b, long time) { float t = (float) (time - a.getTime()) / (b.getTime() - a.getTime()); Vector3f newPos = BaseVector3f.lerp(a.getPosition(), b.getPosition(), t); Quat4f newRot = BaseQuat4f.interpolate(a.getRotation(), b.getRotation(), t); LocationComponent location = entity.getComponent(LocationComponent.class); location.setWorldPosition(newPos); location.setWorldRotation(newRot); entity.saveComponent(location); CharacterMovementComponent movementComponent = entity.getComponent(CharacterMovementComponent.class); movementComponent.mode = a.getMode(); movementComponent.setVelocity(a.getVelocity()); movementComponent.grounded = a.isGrounded(); if (b.getFootstepDelta() < a.getFootstepDelta()) { movementComponent.footstepDelta = t * (1 + b.getFootstepDelta() - a.getFootstepDelta()) + a.getFootstepDelta(); if (movementComponent.footstepDelta > 1) { movementComponent.footstepDelta -= 1; } } else { movementComponent.footstepDelta = t * (b.getFootstepDelta() - a.getFootstepDelta()) + a.getFootstepDelta(); } entity.saveComponent(movementComponent); setPhysicsLocation(entity, newPos); }