package rajawali; import rajawali.math.Number3D; import rajawali.math.Quaternion; public class ChaseCamera extends Camera { protected Number3D mCameraOffset; protected BaseObject3D mObjectToChase; protected Number3D mUpVector; protected float mSlerpFactor = .1f; protected Quaternion mTmpOr; public ChaseCamera() { this(new Number3D(0, 3, 16), .1f, null); } public ChaseCamera(Number3D cameraOffset, float slerpFactor) { this(cameraOffset, .1f, null); } public ChaseCamera(Number3D cameraOffset, float slerpFactor, BaseObject3D objectToChase) { super(); mTmpOr = new Quaternion(); mUpVector = Number3D.getUpVector(); mCameraOffset = cameraOffset; mObjectToChase = objectToChase; mSlerpFactor = slerpFactor; } public float[] getViewMatrix() { mRotationDirty = false; mPosition.setAllFrom(mCameraOffset); mTmpOr.setAllFrom(mObjectToChase.getOrientation()); mPosition.setAllFrom(mTmpOr.multiply(mCameraOffset)); mPosition.add(mObjectToChase.getPosition()); mTmpOr.inverseSelf(); mOrientation.setAllFrom(Quaternion.slerp(mSlerpFactor, mOrientation, mTmpOr, true)); mOrientation.toRotationMatrix(mRotationMatrix); return super.getViewMatrix(); } public void setCameraOffset(Number3D offset) { mCameraOffset.setAllFrom(offset); } public Number3D getCameraOffset() { return mCameraOffset; } public void setSlerpFactor(float factor) { mSlerpFactor = factor; } public float getSlerpFactor() { return mSlerpFactor; } public BaseObject3D getObjectToChase() { return mObjectToChase; } public void setObjectToChase(BaseObject3D objectToChase) { this.mObjectToChase = objectToChase; } public BaseObject3D getChasedObject() { return mObjectToChase; } }