Move camera update to update graphics

This commit is contained in:
Benau
2018-06-18 13:36:56 +08:00
parent c58119be87
commit 6eb7bf6bba
6 changed files with 45 additions and 53 deletions

View File

@@ -196,8 +196,8 @@ void Camera::setMode(Mode mode)
(m_mode==CM_FALLING && mode==CM_NORMAL) )
{
Vec3 start_offset(0, 1.6f, -3);
Vec3 current_position = m_kart->getTrans()(start_offset);
Vec3 target_position = m_kart->getTrans()(Vec3(0, 0, 1));
Vec3 current_position = m_kart->getSmoothedTrans()(start_offset);
Vec3 target_position = m_kart->getSmoothedTrans()(Vec3(0, 0, 1));
// Don't set position and target the same, otherwise
// nan values will be calculated in ViewArea of camera
m_camera->setPosition(current_position.toIrrVector());
@@ -236,7 +236,7 @@ void Camera::setInitialTransform()
{
if (m_kart == NULL) return;
Vec3 start_offset(0, 1.6f, -3);
Vec3 current_position = m_kart->getTrans()(start_offset);
Vec3 current_position = m_kart->getSmoothedTrans()(start_offset);
assert(!std::isnan(current_position.getX()));
assert(!std::isnan(current_position.getY()));
assert(!std::isnan(current_position.getZ()));
@@ -246,7 +246,7 @@ void Camera::setInitialTransform()
// direction till smoothMoveCamera has corrected this. Setting target
// to position doesn't make sense, but smoothMoves will adjust the
// value before the first frame is rendered
Vec3 target_position = m_kart->getTrans()(Vec3(0, 0, 1));
Vec3 target_position = m_kart->getSmoothedTrans()(Vec3(0, 0, 1));
m_camera->setTarget(target_position.toIrrVector());
m_camera->setRotation(core::vector3df(0, 0, 0));
m_camera->setFOV(m_fov);
@@ -274,7 +274,7 @@ void Camera::update(float dt)
if (race_manager->getNumLocalPlayers() < 2)
{
Vec3 heading(sin(m_kart->getHeading()), 0.0f, cos(m_kart->getHeading()));
SFXManager::get()->positionListener(m_kart->getXYZ(),
SFXManager::get()->positionListener(m_kart->getSmoothedXYZ(),
heading,
Vec3(0, 1, 0));
}

View File

@@ -101,7 +101,7 @@ void CameraDebug::update(float dt)
// high above the kart straight down.
if (m_default_debug_Type==CM_DEBUG_TOP_OF_KART)
{
core::vector3df xyz = m_kart->getXYZ().toIrrVector();
core::vector3df xyz = m_kart->getSmoothedXYZ().toIrrVector();
m_camera->setTarget(xyz);
#define CLOSE_TO_KART
#ifdef CLOSE_TO_KART
@@ -118,9 +118,9 @@ void CameraDebug::update(float dt)
}
else if (m_default_debug_Type==CM_DEBUG_SIDE_OF_KART)
{
core::vector3df xyz = m_kart->getXYZ().toIrrVector();
core::vector3df xyz = m_kart->getSmoothedXYZ().toIrrVector();
Vec3 offset(3, 0, 0);
offset = m_kart->getTrans()(offset);
offset = m_kart->getSmoothedTrans()(offset);
m_camera->setTarget(xyz);
m_camera->setPosition(offset.toIrrVector());
}
@@ -136,7 +136,7 @@ void CameraDebug::update(float dt)
// above the kart).
// Note: this code is replicated from smoothMoveCamera so that
// the camera keeps on pointing to the same spot.
core::vector3df current_target = (m_kart->getXYZ().toIrrVector()
core::vector3df current_target = (m_kart->getSmoothedXYZ().toIrrVector()
+core::vector3df(0, above_kart, 0));
m_camera->setTarget(current_target);
}
@@ -158,7 +158,7 @@ void CameraDebug::positionCamera(float dt, float above_kart, float cam_angle,
float side_way, float distance )
{
Vec3 wanted_position;
Vec3 wanted_target = m_kart->getXYZ();
Vec3 wanted_target = m_kart->getSmoothedXYZ();
if(m_default_debug_Type==CM_DEBUG_GROUND)
{
const btWheelInfo &w = m_kart->getVehicle()->getWheelInfo(2);
@@ -170,7 +170,7 @@ void CameraDebug::positionCamera(float dt, float above_kart, float cam_angle,
Vec3 relative_position(side_way,
fabsf(distance)*tan_up+above_kart,
distance);
btTransform t=m_kart->getTrans();
btTransform t=m_kart->getSmoothedTrans();
if(stk_config->m_camera_follow_skid &&
m_kart->getSkidding()->getVisualSkidRotation()!=0)
{
@@ -196,7 +196,7 @@ void CameraDebug::positionCamera(float dt, float above_kart, float cam_angle,
if (kart && !kart->isFlying())
{
// Rotate the up vector (0,1,0) by the rotation ... which is just column 1
Vec3 up = m_kart->getTrans().getBasis().getColumn(1);
Vec3 up = m_kart->getSmoothedTrans().getBasis().getColumn(1);
float f = 0.04f; // weight for new up vector to reduce shaking
m_camera->setUpVector( f * up.toIrrVector() +
(1.0f - f) * m_camera->getUpVector());

View File

@@ -87,7 +87,7 @@ void CameraEnd::update(float dt)
// First test if the kart is close enough to the next end camera, and
// if so activate it.
if( m_end_cameras.size()>0 &&
m_end_cameras[m_next_end_camera].isReached(m_kart->getXYZ()))
m_end_cameras[m_next_end_camera].isReached(m_kart->getSmoothedXYZ()))
{
m_current_end_camera = m_next_end_camera;
if(m_end_cameras[m_current_end_camera].m_type
@@ -116,7 +116,7 @@ void CameraEnd::update(float dt)
// after changing the relative position in order to get the right
// position here).
const core::vector3df &cp = m_camera->getPosition();
const Vec3 &kp = m_kart->getXYZ();
const Vec3 &kp = m_kart->getSmoothedXYZ();
// Estimate the fov, assuming that the vector from the camera to
// the kart and the kart length are orthogonal to each other
// --> tan (fov) = kart_length / camera_kart_distance
@@ -125,7 +125,7 @@ void CameraEnd::update(float dt)
float fov = 6*atan2(m_kart->getKartLength(),
(cp-kp.toIrrVector()).getLength());
m_camera->setFOV(fov);
m_camera->setTarget(m_kart->getXYZ().toIrrVector());
m_camera->setTarget(m_kart->getSmoothedXYZ().toIrrVector());
break;
}
case EndCameraInformation::EC_AHEAD_OF_KART:

View File

@@ -224,7 +224,7 @@ void CameraFPS::update(float dt)
m_local_up = up;
// Move the camera with the kart
btTransform t = m_kart->getTrans();
btTransform t = m_kart->getSmoothedTrans();
if (stk_config->m_camera_follow_skid &&
m_kart->getSkidding()->getVisualSkidRotation() != 0)
{

View File

@@ -53,13 +53,13 @@ CameraNormal::CameraNormal(Camera::CameraType type, int camera_index,
m_rotation_range = 0.4f;
m_rotation_range = 0.0f;
m_kart_position = btVector3(0, 0, 0);
m_kart_rotation = btQuaternion(0, 0, 0, 0);
m_kart_rotation = btQuaternion(0, 0, 0, 1);
reset();
m_camera->setNearValue(1.0f);
if (kart)
{
btTransform btt = kart->getTrans();
btTransform btt = kart->getSmoothedTrans();
m_kart_position = btt.getOrigin();
m_kart_rotation = btt.getRotation();
}
@@ -74,24 +74,23 @@ CameraNormal::CameraNormal(Camera::CameraType type, int camera_index,
void CameraNormal::moveCamera(float dt, bool smooth)
{
if(!m_kart) return;
Kart *kart = dynamic_cast<Kart*>(m_kart);
if (kart->isFlying())
{
Vec3 vec3 = m_kart->getXYZ() + Vec3(sin(m_kart->getHeading()) * -4.0f,
Vec3 vec3 = m_kart->getSmoothedXYZ() + Vec3(sin(m_kart->getHeading()) * -4.0f,
0.5f,
cos(m_kart->getHeading()) * -4.0f);
m_camera->setTarget(m_kart->getXYZ().toIrrVector());
m_camera->setTarget(m_kart->getSmoothedXYZ().toIrrVector());
m_camera->setPosition(vec3.toIrrVector());
return;
} // kart is flying
core::vector3df current_position = m_camera->getPosition();
// Smoothly interpolate towards the position and target
const KartProperties *kp = m_kart->getKartProperties();
float max_speed_without_zipper = kp->getEngineMaxSpeed();
float current_speed = m_kart->getSmoothedSpeed();
float current_speed = m_kart->getSpeed();
const Skidding *ks = m_kart->getSkidding();
float skid_factor = ks->getVisualSkidRotation();
@@ -110,18 +109,16 @@ void CameraNormal::moveCamera(float dt, bool smooth)
(0.85f + ratio / 2.5f),
camera_distance * cos(skid_angle / 2));
//m_smooth_dt = 0.3f * dt + 0.7f * m_smooth_dt;
float delta = 1;
float delta2 = 1;
if (smooth)
{
{
delta = (dt*5.0f);
if (delta < 0.0f)
delta = 0.0f;
else if (delta > 1.0f)
delta = 1.0f;
delta2 = dt * 8.0f;
if (delta2 < 0)
delta2 = 0;
@@ -130,7 +127,7 @@ void CameraNormal::moveCamera(float dt, bool smooth)
}
m_camera_offset += (wanted_camera_offset - m_camera_offset) * delta;
btTransform btt = m_kart->getTrans();
btTransform btt = m_kart->getSmoothedTrans();
m_kart_position = btt.getOrigin();
btQuaternion q1, q2;
q1 = m_kart_rotation.normalized();
@@ -141,19 +138,18 @@ void CameraNormal::moveCamera(float dt, bool smooth)
m_kart_rotation = q1.slerp(q2, delta2);
btt.setOrigin(m_kart_position);
btt.setRotation(m_kart_rotation);
btt.setRotation(q1);
Vec3 m_kart_camera_position_with_offset = btt(m_camera_offset);
Vec3 kart_camera_position_with_offset = btt(m_camera_offset);
// next target
Vec3 current_target = btt(Vec3(0, 0.5f, 0));
// new required position of camera
current_position = m_kart_camera_position_with_offset.toIrrVector();
current_position = kart_camera_position_with_offset.toIrrVector();
//Log::info("CAM_DEBUG", "OFFSET: %f %f %f TRANSFORMED %f %f %f TARGET %f %f %f",
// wanted_camera_offset.x(), wanted_camera_offset.y(), wanted_camera_offset.z(),
// m_kart_camera_position_with_offset.x(), m_kart_camera_position_with_offset.y(),
// m_kart_camera_position_with_offset.z(), current_target.x(), current_target.y(),
// kart_camera_position_with_offset.x(), kart_camera_position_with_offset.y(),
// kart_camera_position_with_offset.z(), current_target.x(), current_target.y(),
// current_target.z());
if(getMode()!=CM_FALLING)
@@ -164,11 +160,14 @@ void CameraNormal::moveCamera(float dt, bool smooth)
assert(!std::isnan(m_camera->getPosition().Y));
assert(!std::isnan(m_camera->getPosition().Z));
} // MoveCamera
} // moveCamera
//-----------------------------------------------------------------------------
void CameraNormal::snapToPosition()
{
moveCamera(1, false);
}
moveCamera(1.0f, false);
} // snapToPosition
//-----------------------------------------------------------------------------
/** Determine the camera settings for the current frame.
* \param above_kart How far above the camera should aim at.
@@ -261,7 +260,7 @@ void CameraNormal::update(float dt)
// above the kart).
// Note: this code is replicated from smoothMoveCamera so that
// the camera keeps on pointing to the same spot.
core::vector3df current_target = (m_kart->getXYZ().toIrrVector()
core::vector3df current_target = (m_kart->getSmoothedXYZ().toIrrVector()
+ core::vector3df(0, above_kart, 0));
m_camera->setTarget(current_target);
}
@@ -286,13 +285,13 @@ void CameraNormal::positionCamera(float dt, float above_kart, float cam_angle,
float side_way, float distance, float smoothing)
{
Vec3 wanted_position;
Vec3 wanted_target = m_kart->getTrans()(Vec3(0, above_kart, 0));
Vec3 wanted_target = m_kart->getSmoothedTrans()(Vec3(0, above_kart, 0));
float tan_up = tan(cam_angle);
Vec3 relative_position(side_way,
fabsf(distance)*tan_up+above_kart,
distance);
btTransform t=m_kart->getTrans();
btTransform t=m_kart->getSmoothedTrans();
if(stk_config->m_camera_follow_skid &&
m_kart->getSkidding()->getVisualSkidRotation()!=0)
{
@@ -325,7 +324,7 @@ void CameraNormal::positionCamera(float dt, float above_kart, float cam_angle,
if (kart && !kart->isFlying())
{
// Rotate the up vector (0,1,0) by the rotation ... which is just column 1
Vec3 up = m_kart->getTrans().getBasis().getColumn(1);
Vec3 up = m_kart->getSmoothedTrans().getBasis().getColumn(1);
float f = 0.04f; // weight for new up vector to reduce shaking
m_camera->setUpVector( f * up.toIrrVector() +
(1.0f - f) * m_camera->getUpVector());

View File

@@ -989,6 +989,11 @@ void World::updateGraphics(float dt)
}
}
PROFILER_PUSH_CPU_MARKER("World::updateGraphics (camera)", 0x60, 0x7F, 0);
for (unsigned int i = 0; i < Camera::getNumCameras(); i++)
Camera::getCamera(i)->update(dt);
PROFILER_POP_CPU_MARKER();
projectile_manager->updateGraphics(dt);
Track::getCurrentTrack()->updateGraphics(dt);
} // updateGraphics
@@ -1038,18 +1043,6 @@ void World::update(int ticks)
}
PROFILER_POP_CPU_MARKER();
// Updating during a rewind introduces stuttering in the camera
if (!RewindManager::get()->isRewinding())
{
PROFILER_PUSH_CPU_MARKER("World::update (camera)", 0x60, 0x7F, 0x00);
for (unsigned int i = 0; i < Camera::getNumCameras(); i++)
{
Camera::getCamera(i)->update(stk_config->ticks2Time(ticks));
}
PROFILER_POP_CPU_MARKER();
} // if !rewind
if(race_manager->isRecordingRace()) ReplayRecorder::get()->update(ticks);
Scripting::ScriptEngine *script_engine = Scripting::ScriptEngine::getInstance();
if (script_engine) script_engine->update(ticks);