Exemplo n.º 1
0
        public Rope()
        {
            const int N = 40;

            b2Vec2[] vertices = new b2Vec2[N];
            float[]  masses   = new float[N];

            for (int i = 0; i < N; ++i)
            {
                vertices[i].Set(0.0f, 20.0f - 0.25f * i);
                masses[i] = 1.0f;
            }
            masses[0] = 0.0f;
            masses[1] = 0.0f;

            b2RopeDef def = new b2RopeDef();

            def.vertices = vertices;
            def.count    = N;
            def.gravity.Set(0.0f, -10.0f);
            def.masses  = masses;
            def.damping = 0.1f;
            def.k2      = 1.0f;
            def.k3      = 0.5f;

            m_rope.Initialize(def);

            m_angle = 0.0f;
            m_rope.SetAngle(m_angle);
        }
Exemplo n.º 2
0
    ///
    public void Initialize(b2RopeDef def)
    {
        Debug.Assert(def.count >= 3);
        m_count = def.count;
        m_ps    = Arrays.InitializeWithDefaultInstances <b2Vec2>(m_count);
        m_p0s   = Arrays.InitializeWithDefaultInstances <b2Vec2>(m_count);
        m_vs    = Arrays.InitializeWithDefaultInstances <b2Vec2>(m_count);
        m_ims   = Arrays.InitializeWithDefaultInstances <float>(m_count);

        for (int i = 0; i < m_count; ++i)
        {
            m_ps[i]  = def.vertices[i];
            m_p0s[i] = def.vertices[i];
            m_vs[i].SetZero();

            float m = def.masses[i];
            if (m > 0.0f)
            {
                m_ims[i] = 1.0f / m;
            }
            else
            {
                m_ims[i] = 0.0f;
            }
        }

        int count2 = m_count - 1;
        int count3 = m_count - 2;

        m_Ls = new float[count2];
        m_as = new float[count3];

        for (int i = 0; i < count2; ++i)
        {
            b2Vec2 p1 = m_ps[i];
            b2Vec2 p2 = m_ps[i + 1];
            m_Ls[i] = Utils.b2Distance(p1, p2);
        }

        for (int i = 0; i < count3; ++i)
        {
            b2Vec2 p1 = m_ps[i];
            b2Vec2 p2 = m_ps[i + 1];
            b2Vec2 p3 = m_ps[i + 2];

            b2Vec2 d1 = p2 - p1;
            b2Vec2 d2 = p3 - p2;

            float a = Utils.b2Cross(d1, d2);
            float b = Utils.b2Dot(d1, d2);

            m_as[i] = (float)Math.Atan2(a, b);
        }

        m_gravity = def.gravity;
        m_damping = def.damping;
        m_k2      = def.k2;
        m_k3      = def.k3;
    }