/** Actually sets the camera based on the given parameter. * \param above_kart How far above the camera should aim at. * \param cam_angle Angle above the kart plane for the camera. * \param sideway Sideway movement of the camera. * \param distance Distance from kart. */ void Camera::positionCamera(float dt, float above_kart, float cam_angle, float side_way, float distance, float smoothing) { Vec3 wanted_position; Vec3 wanted_target = m_kart->getXYZ(); if(UserConfigParams::m_camera_debug==2) wanted_target.setY(m_kart->getVehicle()->getWheelInfo(2).m_raycastInfo.m_contactPointWS.getY()); else wanted_target.setY(wanted_target.getY()+above_kart); float tan_up = tan(cam_angle); Vec3 relative_position(side_way, fabsf(distance)*tan_up+above_kart, distance); btTransform t=m_kart->getTrans(); if(stk_config->m_camera_follow_skid && m_kart->getSkidding()->getVisualSkidRotation()!=0) { // If the camera should follow the graphical skid, add the // visual rotation to the relative vector: btQuaternion q(m_kart->getSkidding()->getVisualSkidRotation(), 0, 0); t.setBasis(t.getBasis() * btMatrix3x3(q)); } wanted_position = t(relative_position); if (smoothing) { smoothMoveCamera(dt, wanted_position, wanted_target); } else { if (m_mode!=CM_FALLING) m_camera->setPosition(wanted_position.toIrrVector()); m_camera->setTarget(wanted_target.toIrrVector()); if (race_manager->getNumLocalPlayers() < 2) { sfx_manager->positionListener(m_camera->getPosition(), wanted_target - m_camera->getPosition()); } } Kart *kart = dynamic_cast<Kart*>(m_kart); 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); float f = 0.04f; // weight for new up vector to reduce shaking f = 0; m_camera->setUpVector(f * up.toIrrVector() + (1.0f - f) * m_camera->getUpVector()); } // kart && !flying else m_camera->setUpVector(core::vector3df(0, 1, 0)); } // positionCamera
/** Actually sets the camera based on the given parameter. * \param above_kart How far above the camera should aim at. * \param cam_angle Angle above the kart plane for the camera. * \param sideway Sideway movement of the camera. * \param distance Distance from kart. */ 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(); if(m_default_debug_Type==CM_DEBUG_GROUND) { const btWheelInfo &w = m_kart->getVehicle()->getWheelInfo(2); wanted_target.setY(w.m_raycastInfo.m_contactPointWS.getY()); } else wanted_target.setY(wanted_target.getY()+above_kart); float tan_up = tan(cam_angle); Vec3 relative_position(side_way, fabsf(distance)*tan_up+above_kart, distance); btTransform t=m_kart->getTrans(); if(stk_config->m_camera_follow_skid && m_kart->getSkidding()->getVisualSkidRotation()!=0) { // If the camera should follow the graphical skid, add the // visual rotation to the relative vector: btQuaternion q(m_kart->getSkidding()->getVisualSkidRotation(), 0, 0); t.setBasis(t.getBasis() * btMatrix3x3(q)); } if (m_default_debug_Type == CM_DEBUG_GROUND) { wanted_position = t(relative_position); // Make sure that the Y position is a the same height as the wheel. wanted_position.setY(wanted_target.getY()); } else wanted_position = t(relative_position); if (getMode() != CM_FALLING) m_camera->setPosition(wanted_position.toIrrVector()); m_camera->setTarget(wanted_target.toIrrVector()); Kart *kart = dynamic_cast<Kart*>(m_kart); 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); float f = 0.04f; // weight for new up vector to reduce shaking m_camera->setUpVector( f * up.toIrrVector() + (1.0f - f) * m_camera->getUpVector()); } // kart && !flying else m_camera->setUpVector(core::vector3df(0, 1, 0)); } // positionCamera
/** Computes the wanted camera position and target for normal camera mode. * Besides being used in update(dt), it is also used when switching the * camera from reverse mode to normal mode - in which case we don't want * to have a smooth camera. * \param wanted_position The position the camera should be. * \param wanted_target The target position the camera should target. */ void Camera::computeNormalCameraPosition(Vec3 *wanted_position, Vec3 *wanted_target) { *wanted_target = m_kart->getXYZ(); wanted_target->setY(wanted_target->getY()+ 0.75f); // This first line moves the camera around behind the kart, pointing it // towards where the kart is turning (and turning even more while skidding). // The skidding effect is dampened. float steering = m_kart->getSteerPercent() * (1.0f + (m_kart->getSkidding()->getSkidFactor() - 1.0f) /2.3f ); // quadratically to dampen small variations (but keep sign) float dampened_steer = fabsf(steering) * steering; float tan_up = tan(m_kart->getKartProperties()->getCameraForwardUpAngle()); Vec3 relative_position(-m_distance*m_rotation_range*dampened_steer*0.5f, m_distance*tan_up+0.75f, -m_distance); *wanted_position = m_kart->getTrans()(relative_position); } // computeNormalCameraPosition