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, BarMagnet bm) { Vector3 dir = position - bm.GetClosestEdgePosition(position); if (dir.sqrMagnitude < 100.0f) { dir = position - bm.transform.position; } Vector3 mi = bm.GetMagneticMoment(); float midir = Vector3.Dot(mi, dir.normalized); Vector3 field = 3 * midir * dir.normalized - mi; field *= Mathf.Pow(dir.magnitude, -3); return(k * field); }
private bool BeBlocked(BarMagnet b1, BarMagnet b2) { Vector3 b2Edge = b2.GetClosestEdgePosition(b1.transform.position); Vector3 b1Edge = b1.GetClosestEdgePosition(b2.transform.position); Vector3 dir = b2Edge - b1Edge; bool blocked = false; RaycastHit hitInfo; if (Physics.Raycast(b1Edge - dir * 0.1f, dir, out hitInfo, dir.sqrMagnitude)) { if (!hitInfo.collider.transform.parent.Equals(b2.transform)) { blocked = true; } //Debug.Log (hitInfo.collider); } //Debug.Log("blocked" + blocked); return(blocked); }