void CameraProxy::_update_following(double dt) { if(following_actor_ && stage->has_actor(following_actor_)) { float t = (fabs(following_lag_) < kmEpsilon) ? 1.0 : dt * (1.0 / following_lag_); auto actor = stage->actor(following_actor_); Vec3 avatar_position = actor->absolute_position(); Quaternion avatar_rotation = actor->absolute_rotation(); Quaternion initial_rotation = absolute_rotation(); Vec3 initial_position = absolute_position(); Vec3 destination_position; Quaternion destination_rotation; if(following_mode_ == CAMERA_FOLLOW_MODE_DIRECT) { destination_position = avatar_position + following_offset_.rotated_by(avatar_rotation); destination_rotation = calc_look_at_rotation(avatar_position); } else if(following_mode_ == CAMERA_FOLLOW_MODE_THIRD_PERSON) { float yaw = kmQuaternionGetYaw(&avatar_rotation); kmQuaternionRotationPitchYawRoll(&destination_rotation, 0, yaw, 0); destination_position = following_offset_.rotated_by(destination_rotation) + avatar_position; } else { throw std::logic_error("Unknown camera follow mode"); } set_absolute_position(initial_position.lerp(destination_position, t)); set_absolute_rotation(initial_rotation.slerp(destination_rotation, t)); } else { //The actor was destroyed, so reset following_actor_ = ActorID(); } }
float Camera::getYaw() const { return kmQuaternionGetYaw(&mCamera.cameraNode.rotation); }