void UpdateController(double dt) { double dzFactor = Math.Pow(1.02, Math.Min(dt, 1.0)); if (m_near) { m_target.distance = m_target.distance / (dzFactor * m_zoomSpeed); } else if (m_far) { m_target.distance = m_target.distance * dzFactor * m_zoomSpeed; } TerrainView.Position p = new TerrainView.Position(); GetPosition(p); SetPosition(m_target); if (m_forward) { double speed = Math.Max(m_view.GetHeight(), 1.0); m_view.MoveForward(speed * dt * m_moveSpeed); } else if (m_backward) { double speed = Math.Max(m_view.GetHeight(), 1.0); m_view.MoveForward(-speed * dt * m_moveSpeed); } if (m_left) { m_view.Turn(dt * m_turnSpeed); } else if (m_right) { m_view.Turn(-dt * m_turnSpeed); } GetPosition(m_target); if (m_smooth) { double lerp = 1.0 - Math.Exp(-dt * 2.301e-3); double x0 = 0.0; double y0 = 0.0; m_view.InterpolatePos(p.x0, p.y0, m_target.x0, m_target.y0, lerp, ref x0, ref y0); p.x0 = x0; p.y0 = y0; p.theta = Mix2(p.theta, m_target.theta, lerp); p.phi = Mix2(p.phi, m_target.phi, lerp); p.distance = Mix2(p.distance, m_target.distance, lerp); SetPosition(p); } else { SetPosition(m_target); } }