コード例 #1
0
        /// <summary>
        /// Add an internal spring to this body.
        /// </summary>
        /// <param name="pointA">point mass on 1st end of the spring</param>
        /// <param name="pointB">point mass on 2nd end of the spring</param>
        /// <param name="springK">spring constant</param>
        /// <param name="damping">spring damping</param>
        public void addInternalSpring(int pointA, int pointB, float springK, float damping)
        {
            float          dist = (mPointMasses[pointB].Position - mPointMasses[pointA].Position).magnitude;
            InternalSpring s    = new InternalSpring(pointA, pointB, dist, springK, damping);

            mSprings.Add(s);
        }
コード例 #2
0
        public override void accumulateInternalForces()
        {
            base.accumulateInternalForces();

            // internal spring forces.
            Vector2 force = new Vector2();

            for (int i = 0; i < mSprings.Count; i++)
            {
                InternalSpring s = mSprings[i];
                VectorTools.calculateSpringForce(ref mPointMasses[s.pointMassA].Position, ref mPointMasses[s.pointMassA].Velocity,
                                                 ref mPointMasses[s.pointMassB].Position, ref mPointMasses[s.pointMassB].Velocity,
                                                 s.springD, s.springK, s.damping,
                                                 ref force);

                mPointMasses[s.pointMassA].Force.x += force.x;
                mPointMasses[s.pointMassA].Force.y += force.y;

                mPointMasses[s.pointMassB].Force.x -= force.x;
                mPointMasses[s.pointMassB].Force.y -= force.y;
            }

            // shape matching forces.
            if (mShapeMatchingOn)
            {
                Vector2 p = DerivedPos;
                mBaseShape.transformVertices(ref p, DerivedAngle, ref mScale, ref mGlobalShape);
                DerivedPos = p;
                for (int i = 0; i < mPointMasses.Count; i++)
                {
                    if (mShapeSpringK > 0)
                    {
                        if (!mKinematic)
                        {
                            VectorTools.calculateSpringForce(ref mPointMasses[i].Position, ref mPointMasses[i].Velocity,
                                                             ref mGlobalShape[i], ref mPointMasses[i].Velocity, 0.0f, mShapeSpringK, mShapeSpringDamp,
                                                             ref force);
                        }
                        else
                        {
                            Vector2 kinVel = Vector2.zero;
                            VectorTools.calculateSpringForce(ref mPointMasses[i].Position, ref mPointMasses[i].Velocity,
                                                             ref mGlobalShape[i], ref kinVel, 0.0f, mShapeSpringK, mShapeSpringDamp,
                                                             ref force);
                        }

                        mPointMasses[i].Force.x += force.x;
                        mPointMasses[i].Force.y += force.y;
                    }
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Add an internal spring to this body.
        /// </summary>
        /// <param name="pointA">point mass on 1st end of the spring</param>
        /// <param name="pointB">point mass on 2nd end of the spring</param>
        /// <param name="springK">spring constant</param>
        /// <param name="damping">spring damping</param>
        public void addInternalSpring(int pointA, int pointB, float springK, float damping)
        {
            float dist = (mPointMasses[pointB].Position - mPointMasses[pointA].Position).magnitude;
            InternalSpring s = new InternalSpring(pointA, pointB, dist, springK, damping);

            mSprings.Add(s);
        }