Roll the camera when gyroscope is used, for visual representation of steering

This commit is contained in:
Sergii Pylypenko 2018-10-19 15:49:34 +03:00
parent 714e5a75a2
commit 2114c18ab7
3 changed files with 53 additions and 10 deletions

View File

@ -135,7 +135,7 @@ void CameraEnd::update(float dt)
positionCamera(dt, /*above_kart*/0.75f, positionCamera(dt, /*above_kart*/0.75f,
cam_angle, /*side_way*/0, cam_angle, /*side_way*/0,
2.0f*getDistanceToKart(), /*smoothing*/false); 2.0f*getDistanceToKart(), /*smoothing*/false, 0.0f);
break; break;
} }
default: break; default: break;

View File

@ -20,6 +20,10 @@
#include "graphics/camera_normal.hpp" #include "graphics/camera_normal.hpp"
#include "config/stk_config.hpp" #include "config/stk_config.hpp"
#include "config/user_config.hpp"
#include "input/device_manager.hpp"
#include "input/input_manager.hpp"
#include "input/multitouch_device.hpp"
#include "karts/abstract_kart.hpp" #include "karts/abstract_kart.hpp"
#include "karts/explosion_animation.hpp" #include "karts/explosion_animation.hpp"
#include "karts/kart.hpp" #include "karts/kart.hpp"
@ -175,10 +179,11 @@ void CameraNormal::snapToPosition()
* \param cam_angle Angle above the kart plane for the camera. * \param cam_angle Angle above the kart plane for the camera.
* \param sideway Sideway movement of the camera. * \param sideway Sideway movement of the camera.
* \param distance Distance from kart. * \param distance Distance from kart.
* \param cam_roll_angle Roll camera for gyroscope steering effect.
*/ */
void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle, void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle,
float *sideway, float *distance, float *sideway, float *distance,
bool *smoothing) bool *smoothing, float *cam_roll_angle)
{ {
const KartProperties *kp = m_kart->getKartProperties(); const KartProperties *kp = m_kart->getKartProperties();
@ -197,6 +202,15 @@ void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle,
float dampened_steer = fabsf(steering) * steering; float dampened_steer = fabsf(steering) * steering;
*sideway = -m_rotation_range*dampened_steer*0.5f; *sideway = -m_rotation_range*dampened_steer*0.5f;
*smoothing = true; *smoothing = true;
*cam_roll_angle = 0.0f;
if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE)
{
MultitouchDevice* device = input_manager->getDeviceManager()->getMultitouchDevice();
if (device)
{
*cam_roll_angle = -device->getOrientation();
}
}
break; break;
} // CM_FALLING } // CM_FALLING
case CM_REVERSE: // Same as CM_NORMAL except it looks backwards case CM_REVERSE: // Same as CM_NORMAL except it looks backwards
@ -206,6 +220,15 @@ void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle,
*sideway = 0; *sideway = 0;
*distance = 2.0f*m_distance; *distance = 2.0f*m_distance;
*smoothing = false; *smoothing = false;
*cam_roll_angle = 0.0f;
if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE)
{
MultitouchDevice* device = input_manager->getDeviceManager()->getMultitouchDevice();
if (device)
{
*cam_roll_angle = device->getOrientation();
}
}
break; break;
} }
case CM_CLOSEUP: // Lower to the ground and closer to the kart case CM_CLOSEUP: // Lower to the ground and closer to the kart
@ -217,6 +240,15 @@ void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle,
* m_kart->getSkidding()->getSkidFactor(); * m_kart->getSkidding()->getSkidFactor();
*distance = -0.5f*m_distance; *distance = -0.5f*m_distance;
*smoothing = false; *smoothing = false;
*cam_roll_angle = 0.0f;
if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE)
{
MultitouchDevice* device = input_manager->getDeviceManager()->getMultitouchDevice();
if (device)
{
*cam_roll_angle = -device->getOrientation();
}
}
break; break;
} }
case CM_LEADER_MODE: case CM_LEADER_MODE:
@ -226,6 +258,7 @@ void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle,
*sideway = 0; *sideway = 0;
*distance = 2.0f*m_distance; *distance = 2.0f*m_distance;
*smoothing = true; *smoothing = true;
*cam_roll_angle = 0.0f;
break; break;
} }
case CM_SIMPLE_REPLAY: case CM_SIMPLE_REPLAY:
@ -252,10 +285,10 @@ void CameraNormal::update(float dt)
dynamic_cast<ExplosionAnimation*>(m_kart->getKartAnimation()); dynamic_cast<ExplosionAnimation*>(m_kart->getKartAnimation());
if (ea && !ea->hasResetAlready()) if (ea && !ea->hasResetAlready())
{ {
float above_kart, cam_angle, side_way, distance; float above_kart, cam_angle, side_way, distance, cam_roll_angle;
bool smoothing; bool smoothing;
getCameraSettings(&above_kart, &cam_angle, &side_way, &distance, &smoothing); getCameraSettings(&above_kart, &cam_angle, &side_way, &distance, &smoothing, &cam_roll_angle);
// The camera target needs to be 'smooth moved', otherwise // The camera target needs to be 'smooth moved', otherwise
// there will be a noticable jump in the first frame // there will be a noticable jump in the first frame
@ -269,10 +302,10 @@ void CameraNormal::update(float dt)
} }
else // no kart animation else // no kart animation
{ {
float above_kart, cam_angle, side_way, distance; float above_kart, cam_angle, side_way, distance, cam_roll_angle;
bool smoothing; bool smoothing;
getCameraSettings(&above_kart, &cam_angle, &side_way, &distance, &smoothing); getCameraSettings(&above_kart, &cam_angle, &side_way, &distance, &smoothing, &cam_roll_angle);
positionCamera(dt, above_kart, cam_angle, side_way, distance, smoothing); positionCamera(dt, above_kart, cam_angle, side_way, distance, smoothing, cam_roll_angle);
} }
} // update } // update
@ -283,9 +316,11 @@ void CameraNormal::update(float dt)
* \param cam_angle Angle above the kart plane for the camera. * \param cam_angle Angle above the kart plane for the camera.
* \param sideway Sideway movement of the camera. * \param sideway Sideway movement of the camera.
* \param distance Distance from kart. * \param distance Distance from kart.
* \param cam_roll_angle Roll camera for gyroscope steering effect.
*/ */
void CameraNormal::positionCamera(float dt, float above_kart, float cam_angle, void CameraNormal::positionCamera(float dt, float above_kart, float cam_angle,
float side_way, float distance, float smoothing) float side_way, float distance, float smoothing,
float cam_roll_angle)
{ {
Vec3 wanted_position; Vec3 wanted_position;
Vec3 wanted_target = m_kart->getSmoothedTrans()(Vec3(0, above_kart, 0)); Vec3 wanted_target = m_kart->getSmoothedTrans()(Vec3(0, above_kart, 0));
@ -334,4 +369,11 @@ void CameraNormal::positionCamera(float dt, float above_kart, float cam_angle,
} // kart && !flying } // kart && !flying
else else
m_camera->setUpVector(core::vector3df(0, 1, 0)); m_camera->setUpVector(core::vector3df(0, 1, 0));
if (cam_roll_angle != 0.0f)
{
irr::core::vector3df up(0, 1, 0);
up.rotateXYBy(cam_roll_angle * (180.0f / M_PI));
m_camera->setUpVector(up);
}
} // positionCamera } // positionCamera

View File

@ -55,10 +55,11 @@ private:
void handleEndCamera(float dt); void handleEndCamera(float dt);
void getCameraSettings(float *above_kart, float *cam_angle, void getCameraSettings(float *above_kart, float *cam_angle,
float *side_way, float *distance, float *side_way, float *distance,
bool *smoothing); bool *smoothing, float *cam_roll_angle);
void positionCamera(float dt, float above_kart, float cam_angle, void positionCamera(float dt, float above_kart, float cam_angle,
float side_way, float distance, float smoothing); float side_way, float distance, float smoothing,
float cam_roll_angle);
btVector3 m_kart_position; btVector3 m_kart_position;
btQuaternion m_kart_rotation; btQuaternion m_kart_rotation;