Ejemplo n.º 1
0
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();
    }
}
Ejemplo n.º 2
0
 float Camera::getYaw() const
 {
     return kmQuaternionGetYaw(&mCamera.cameraNode.rotation);
 }