コード例 #1
0
        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);
            }
        }