void CCameraFlight::SetMoveSpeed(float fMpS /* = 4.0f */) { CRY_ASSERT(fMpS > 0.0f); fMpS = max(fMpS, g_fCamError); if(m_cameraCourse.size() < 3) { m_fFlightSpeed = 1.0f; return; } //collect flight distance float fMoveDistance = max(0.01f, GetCourseLength()); //compute speed per second float fFlightTime = fMoveDistance / fMpS; m_fFlightSpeed = 1.0f / fFlightTime; m_fMoveSpeedMps = fMpS; }
SCameraFlightPoint CCameraFlight::GetTrackPoint(float t) { //clamp to 0..1 range CRY_ASSERT(t >= 0.0f && t <= 1.0f); t = clamp(t, 0.0f, 1.0f); float fLength = GetCourseLength(); float fPositionOffset = fLength * t; CRY_ASSERT(!m_cameraCourse.empty()); std::vector<SCameraFlightPoint>::const_iterator iter = m_cameraCourse.begin(); // iterate to the second position ++iter; std::vector<SCameraFlightPoint>::const_iterator end = m_cameraCourse.end(); float fMoveDistance = 0.0f; float fLastMoveDistance = 0.0f; Vec3 vTempPos = m_cameraCourse[0].m_vCamPos; Vec3 vLastLookAt = m_cameraCourse[0].m_vCamLookAt; //compute track position for t for(; iter != end; ++iter) { fLastMoveDistance = fMoveDistance; Vec3 vEdge = iter->m_vCamPos - vTempPos; float fEdgeDistance = vEdge.len(); fMoveDistance += fEdgeDistance; if(fMoveDistance > fPositionOffset) { float fEdgeDelta = fPositionOffset - fLastMoveDistance; Vec3 vLookDelta = (iter->m_vCamLookAt - vLastLookAt).normalized(); return SCameraFlightPoint(vTempPos + fEdgeDelta * vEdge.normalized(), vLastLookAt + fEdgeDelta * vLookDelta) + m_vRefPos; } //update last Pos vLastLookAt = iter->m_vCamLookAt; vTempPos = iter->m_vCamPos; } //all points are relative to m_vRefPos (which can be ZERO) return m_cameraCourse[0] + m_vRefPos; }