add camera parameter forward-smoothing (bool to set smoothing) and implement forward-up-angle in smoothing case

This commit is contained in:
luffah 2020-03-15 19:32:15 +01:00
parent bb3e54fd88
commit 8449bf2714
8 changed files with 39 additions and 8 deletions

View File

@ -180,11 +180,13 @@
Distance between kart and camera. Distance between kart and camera.
forward-up-angle: Angle between camera and plane of kart (pitch) forward-up-angle: Angle between camera and plane of kart (pitch)
when the camera is pointing forward when the camera is pointing forward
forward-smoothing: if true, use smoothing (forward-up-angle become relative to speed) when pointing forward
backward-up-angle: Angle between camera and plane of kart (pitch) backward-up-angle: Angle between camera and plane of kart (pitch)
when the camera is pointing backwards. This is usually when the camera is pointing backwards. This is usually
larger than the forward-up-angle, since the kart itself larger than the forward-up-angle, since the kart itself
otherwise obstricts too much of the view. --> otherwise obstricts too much of the view. -->
<camera distance="1.0" forward-up-angle="15" <camera distance="1.0"
forward-up-angle="0" forward-smoothing="true"
backward-up-angle="5" /> backward-up-angle="5" />
<!-- Jump animation <!-- Jump animation

View File

@ -77,7 +77,7 @@ CameraNormal::CameraNormal(Camera::CameraType type, int camera_index,
* \param dt Delta time, * \param dt Delta time,
* \param if false, the camera instantly moves to the endpoint, or else it smoothly moves * \param if false, the camera instantly moves to the endpoint, or else it smoothly moves
*/ */
void CameraNormal::moveCamera(float dt, bool smooth) void CameraNormal::moveCamera(float dt, bool smooth, float cam_angle, float distance)
{ {
if(!m_kart) return; if(!m_kart) return;
@ -108,11 +108,16 @@ void CameraNormal::moveCamera(float dt, bool smooth)
// distance of camera from kart in x and z plane // distance of camera from kart in x and z plane
float camera_distance = -1.25f - 2.5f * ratio; float camera_distance = -1.25f - 2.5f * ratio;
if (camera_distance > -2.0f) camera_distance = -2.0f; // don't get too close to the kart float min_distance = (distance * 2.0f);
if (distance > 0) camera_distance += distance + 1; // note that distance < 0
if (camera_distance > min_distance) camera_distance = min_distance; // don't get too close to the kart
float tan_up = 0;
if (cam_angle > 0) tan_up = tanf(cam_angle) * distance;
// Defines how far camera should be from player kart. // Defines how far camera should be from player kart.
Vec3 wanted_camera_offset(camera_distance * sinf(skid_angle / 2), Vec3 wanted_camera_offset(camera_distance * sinf(skid_angle / 2),
(0.85f + ratio / 2.5f), (0.85f + ratio / 2.5f) - tan_up,
camera_distance * cosf(skid_angle / 2)); camera_distance * cosf(skid_angle / 2));
float delta = 1; float delta = 1;
@ -172,7 +177,7 @@ void CameraNormal::moveCamera(float dt, bool smooth)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void CameraNormal::snapToPosition() void CameraNormal::snapToPosition()
{ {
moveCamera(1.0f, false); moveCamera(1.0f, false, 0, 0);
} // snapToPosition } // snapToPosition
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -203,7 +208,7 @@ void CameraNormal::getCameraSettings(float *above_kart, float *cam_angle,
// quadratically to dampen small variations (but keep sign) // quadratically to dampen small variations (but keep sign)
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 = kp->getCameraForwardSmoothing();
*cam_roll_angle = 0.0f; *cam_roll_angle = 0.0f;
if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE) if (UserConfigParams::m_multitouch_controls == MULTITOUCH_CONTROLS_GYROSCOPE)
{ {
@ -369,7 +374,7 @@ void CameraNormal::positionCamera(float dt, float above_kart, float cam_angle,
if (smoothing) if (smoothing)
{ {
moveCamera(dt, true); moveCamera(dt, true, cam_angle, distance);
} }
else else
{ {

View File

@ -51,7 +51,7 @@ private:
Vec3 m_camera_offset; Vec3 m_camera_offset;
void moveCamera(float dt, bool smooth); void moveCamera(float dt, bool smooth, float cam_angle, float distance);
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,

View File

@ -111,6 +111,8 @@ AbstractCharacteristic::ValueType AbstractCharacteristic::getType(
return TYPE_FLOAT; return TYPE_FLOAT;
case CAMERA_FORWARD_UP_ANGLE: case CAMERA_FORWARD_UP_ANGLE:
return TYPE_FLOAT; return TYPE_FLOAT;
case CAMERA_FORWARD_SMOOTHING:
return TYPE_BOOL;
case CAMERA_BACKWARD_UP_ANGLE: case CAMERA_BACKWARD_UP_ANGLE:
return TYPE_FLOAT; return TYPE_FLOAT;
case JUMP_ANIMATION_TIME: case JUMP_ANIMATION_TIME:
@ -863,6 +865,18 @@ float AbstractCharacteristic::getCameraForwardUpAngle() const
return result; return result;
} // getCameraForwardUpAngle } // getCameraForwardUpAngle
// ----------------------------------------------------------------------------
bool AbstractCharacteristic::getCameraForwardSmoothing() const
{
bool result;
bool is_set = false;
process(CAMERA_FORWARD_SMOOTHING, &result, &is_set);
if (!is_set)
Log::fatal("AbstractCharacteristic", "Can't get characteristic %s",
getName(CAMERA_FORWARD_SMOOTHING).c_str());
return result;
} // getCameraForwardSmoothing (advanced option)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
float AbstractCharacteristic::getCameraBackwardUpAngle() const float AbstractCharacteristic::getCameraBackwardUpAngle() const
{ {

View File

@ -114,6 +114,7 @@ public:
// Camera // Camera
CAMERA_DISTANCE, CAMERA_DISTANCE,
CAMERA_FORWARD_UP_ANGLE, CAMERA_FORWARD_UP_ANGLE,
CAMERA_FORWARD_SMOOTHING,
CAMERA_BACKWARD_UP_ANGLE, CAMERA_BACKWARD_UP_ANGLE,
// Jump // Jump
@ -298,6 +299,7 @@ public:
float getCameraDistance() const; float getCameraDistance() const;
float getCameraForwardUpAngle() const; float getCameraForwardUpAngle() const;
bool getCameraForwardSmoothing() const;
float getCameraBackwardUpAngle() const; float getCameraBackwardUpAngle() const;
float getJumpAnimationTime() const; float getJumpAnimationTime() const;

View File

@ -785,6 +785,11 @@ float KartProperties::getCameraForwardUpAngle() const
return m_cached_characteristic->getCameraForwardUpAngle(); return m_cached_characteristic->getCameraForwardUpAngle();
} // getCameraForwardUpAngle } // getCameraForwardUpAngle
bool KartProperties::getCameraForwardSmoothing() const
{
return m_cached_characteristic->getCameraForwardSmoothing();
} // getCameraForwardSmoothing
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
float KartProperties::getCameraBackwardUpAngle() const float KartProperties::getCameraBackwardUpAngle() const
{ {

View File

@ -405,6 +405,7 @@ public:
float getCameraDistance() const; float getCameraDistance() const;
float getCameraForwardUpAngle() const; float getCameraForwardUpAngle() const;
bool getCameraForwardSmoothing() const;
float getCameraBackwardUpAngle() const; float getCameraBackwardUpAngle() const;
float getJumpAnimationTime() const; float getJumpAnimationTime() const;

View File

@ -403,6 +403,8 @@ void XmlCharacteristic::load(const XMLNode *node)
&m_values[CAMERA_DISTANCE]); &m_values[CAMERA_DISTANCE]);
sub_node->get("forward-up-angle", sub_node->get("forward-up-angle",
&m_values[CAMERA_FORWARD_UP_ANGLE]); &m_values[CAMERA_FORWARD_UP_ANGLE]);
sub_node->get("forward-smoothing",
&m_values[CAMERA_FORWARD_SMOOTHING]);
sub_node->get("backward-up-angle", sub_node->get("backward-up-angle",
&m_values[CAMERA_BACKWARD_UP_ANGLE]); &m_values[CAMERA_BACKWARD_UP_ANGLE]);
} }