private Vector3 ComputeInducedMagneticMoment(BarMagnet bm, FerroMagnet fm) { if (radius < 0.1f) { return(new Vector3(0.0f, 0.0f, 0.0f)); } float volume = 1.333f * Mathf.PI * radius * radius * radius; float calcScale = 3 * permiability / (3 + permiability); Vector3 magnetizeVal = new Vector3(0.0f, 0.0f, 0.0f); if (bm) { Vector3 bmEdgePos = bm.GetClosestEdgePosition(transform.position); Vector3 spEdgePos = GetClosestEdgePosition(bmEdgePos); magnetizeVal = calcScale * inverseU0 * MagneticSystem.Instance.CalcMField(spEdgePos, bm); //Debug.Log("bm" + magnetizeVal); } else { Vector3 spEdgePosFM = fm.GetClosestEdgePosition(transform.position); Vector3 spEdgePos = GetClosestEdgePosition(spEdgePosFM); magnetizeVal = calcScale * inverseU0 * MagneticSystem.Instance.CalcMField(spEdgePos, fm); //Debug.Log("fm" + magnetizeVal); } return(volume * magnetizeVal); }
public Vector3 CalcMField(Vector3 position, FerroMagnet fm) { //Vector3 dir = position - fm.transform.position; Vector3 dir = position - fm.GetClosestEdgePosition(position); if (dir.sqrMagnitude < 100.0f) { dir = position - fm.transform.position; } Vector3 mi = fm.GetInducedMagneticMoment(); float midir = Vector3.Dot(mi, dir.normalized); Vector3 field = 3 * midir * dir.normalized - mi; field *= Mathf.Pow(dir.magnitude, -3); return(k * field); }