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); }
/// 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; }