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