Example #1
0
        // -----------------------------------------------------------------
        /// <summary>
        /// Compute the new velocity for one entity
        /// </summary>
        // -----------------------------------------------------------------
        protected void UpdateVelocity(int start, NBodyValue valA, float timedelta)
        {
            int length = m_localIDList.Length;

            for (int j = start + 1; j < length; j++)
            {
                UUID idB = m_localIDList[j];
                if (idB == UUID.Zero)
                {
                    continue;
                }

                NBodyValue   valB = m_entityList[idB];
                VelocityPair vp   = ComputeVelocityDelta(valA, valB);

                if (valA.CanMove && valB.CanAttract)
                {
                    valA.Velocity += vp.ABVelocity * timedelta;
                }

                if (valB.CanMove && valA.CanAttract)
                {
                    Vector3 nv = valB.Velocity + (vp.BAVelocity * timedelta);
                    valB.Velocity = nv;
                }
            }
        }
Example #2
0
        // -----------------------------------------------------------------
        /// <summary>
        ///
        /// </summary>
        // -----------------------------------------------------------------
        public void Dump()
        {
            m_log.WarnFormat("[N-BodyGroup] dump entity list");

            lock (m_entityList)
            {
                //foreach (KeyValuePair<UUID,NBodyValue> kp in m_entityList)
                //    m_log.WarnFormat("[N-BodyGroup] PRE id={0}, mass={1}, velocity={2}, pos={3}",
                //        kp.Key,kp.Value.Mass,kp.Value.Velocity,kp.Value.Position);

                // iterate through the entities that can move
                foreach (KeyValuePair <UUID, NBodyValue> kpmover in m_entityList)
                {
                    if (!kpmover.Value.CanMove)
                    {
                        continue;
                    }

                    SceneObjectPart sopmover = m_scene.GetSceneObjectPart(kpmover.Key);
                    if (sopmover == null)
                    {
                        continue;
                    }

                    // Copy the position in from the scene
                    kpmover.Value.Position = OSPosition2NBPosition(sopmover.AbsolutePosition);
                    Vector3 velocity = ComputeInitialVelocity(kpmover.Value);

                    // iterate through the entities that can attract
                    foreach (KeyValuePair <UUID, NBodyValue> kpattractor in m_entityList)
                    {
                        if (!kpattractor.Value.CanAttract)
                        {
                            continue;
                        }

                        SceneObjectPart sopattractor = m_scene.GetSceneObjectPart(kpattractor.Key);
                        if (sopattractor == null)
                        {
                            continue;
                        }

                        if (sopattractor == sopmover)
                        {
                            continue;
                        }

                        // Copy the current position in from the scene
                        kpattractor.Value.Position = OSPosition2NBPosition(sopattractor.AbsolutePosition);

                        // Compute the change in velocity caused by this
                        VelocityPair vp = ComputeVelocityDelta(kpmover.Value, kpattractor.Value);
                        m_log.WarnFormat("[N-BodyGroup] {0}->{1} : {2}", kpmover.Key, kpattractor.Key, vp.ABVelocity);
                        velocity += vp.ABVelocity;
                    }

                    m_log.WarnFormat("[N-BodyGroup] ****** {0} : {1}", kpmover.Key, velocity);
                }
            }
        }
Example #3
0
        // -----------------------------------------------------------------
        /// <summary>
        ///
        /// </summary>
        // -----------------------------------------------------------------
        protected override VelocityPair ComputeVelocityDelta(NBodyValue v1, NBodyValue v2)
        {
            UInt32 v1ID = v1.LocalID;
            UInt32 v2ID = v2.LocalID;

            Vector3 direction = Vector3.Normalize(v2.Position - v1.Position);

            VelocityPair vp = new VelocityPair();

            vp.ABVelocity = direction * CachedAttraction[(int)v1ID][(int)v2ID];
            vp.BAVelocity = (-direction) * CachedAttraction[(int)v2ID][(int)v1ID];
            return(vp);
        }
Example #4
0
        // -----------------------------------------------------------------
        /// <summary>
        ///
        /// </summary>
        // -----------------------------------------------------------------
        protected override VelocityPair ComputeVelocityDelta(NBodyValue v1, NBodyValue v2)
        {
            VelocityPair vp = new VelocityPair();

            Vector3 direction = Vector3.Normalize(v2.Position - v1.Position);
            double  dsquared  = Vector3.DistanceSquared(v1.Position, v2.Position);

            if (dsquared == 0)
            {
                dsquared = 0.0000000001;
            }

            // F = s * (m1 * m2) / d^2
            // acceleration is the similarity attraction * mass of the attractor divided
            // by the distance separating the body and attractor
            double force = GravitationalConstant * v1.Mass * v2.Mass / dsquared;


            // a = F/m
            vp.ABVelocity = direction * (float)(force / v1.Mass);
            vp.BAVelocity = (-direction) * (float)(force / v2.Mass);

            return(vp);
        }
        // -----------------------------------------------------------------
        /// <summary>
        /// 
        /// </summary>
        // -----------------------------------------------------------------
        protected override VelocityPair ComputeVelocityDelta(NBodyValue v1, NBodyValue v2)
        {
            VelocityPair vp = new VelocityPair();

            Vector3 direction = Vector3.Normalize(v2.Position-v1.Position);
            double dsquared = Vector3.DistanceSquared(v1.Position,v2.Position);
            if (dsquared == 0)
                dsquared = 0.0000000001;

            // F = s * (m1 * m2) / d^2
            // acceleration is the similarity attraction * mass of the attractor divided
            // by the distance separating the body and attractor
            double force = GravitationalConstant * v1.Mass * v2.Mass / dsquared;

            // a = F/m
            vp.ABVelocity = direction * (float)(force / v1.Mass);
            vp.BAVelocity = (-direction) * (float)(force / v2.Mass);

            return vp;
        }
        // -----------------------------------------------------------------
        /// <summary>
        /// 
        /// </summary>
        // -----------------------------------------------------------------
        protected override VelocityPair ComputeVelocityDelta(NBodyValue v1, NBodyValue v2)
        {
            UInt32 v1ID = v1.LocalID;
            UInt32 v2ID = v2.LocalID;

            Vector3 direction = Vector3.Normalize(v2.Position - v1.Position);

            VelocityPair vp = new VelocityPair();
            vp.ABVelocity = direction * CachedAttraction[(int)v1ID][(int)v2ID];
            vp.BAVelocity = (-direction) * CachedAttraction[(int)v2ID][(int)v1ID];
            return vp;
        }