Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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);
    }