Exemplo n.º 1
0
    public void Connect()
    {
        if (sbond == null)
        {
            return;
        }

        sbond.GetComponent <Renderer>().material = Resources.Load("_Materials/Default") as Material;
        Destroy(satom);

        // get molecules and atoms
        Molecule m1 = catom.GetComponentInParent <Molecule>();
        Molecule m2 = GetComponentInParent <Molecule>();
        Atom     a1 = catom.GetComponent <Atom>();
        Atom     a2 = GetComponent <Atom>();

        //set sbond's parent to molecule
        sbond.transform.parent = catom.transform.parent;


        // 更新目标原子的vbond,标记一个化学键为已使用,抓取原子的vbond由之后的getAngle()函数更新
        a1.setVbondUsed(catomBondIndex);

        //move and rotate grabbed atom to fix positon
        //translate
        transform.parent.transform.position += expectedPos - transform.position;
        //rotate
        Vector3 vec1 = (sbond.transform.position - catom.transform.position).normalized;
        Vector3 vec2 = (transform.TransformDirection(a2.getAngle(selfBondIndex))).normalized;

        float an = 180 - Vector3.Angle(vec1, vec2);

        if (vec1 == vec2)
        {
            Vector3 axis = CaculateUtil.GetVerticalDir(vec1);
            transform.parent.transform.RotateAround(transform.position, axis, 180);
        }
        else
        {
            transform.parent.transform.RotateAround(transform.position, Vector3.Cross(vec1, vec2), an);
        }


        //then merge two molecules
        MergeTwoMolecules(catom.transform.parent.gameObject, transform.parent.gameObject);

        //set abstract bond
        Bond b = sbond.AddComponent <Bond>();

        b.A1      = a1.gameObject;
        b.A2      = a2.gameObject;
        b.A1Index = catomBondIndex;
        b.A2Index = selfBondIndex;
        b.Type    = BondType.SINGLE;
        a1.addBond(sbond);
        a2.addBond(sbond);


        sbond = null;
    }
Exemplo n.º 2
0
    private void ConnectAsChain(GameObject atom1, GameObject atom2)
    {
        int     a1Index = -1, a2Index = -1;
        Atom    a1    = atom1.GetComponent <Atom>();
        Atom    a2    = atom2.GetComponent <Atom>();
        Vector3 a1Dir = a1.getAngle(a1Index);
        Vector3 a2Dir = a2.getAngle(a2Index);

        float length = GetBondLength(a1, a2);

        GameObject prefebBond = (GameObject)Resources.Load("_Prefebs/SingleBond") as GameObject;
        GameObject bond       = Instantiate(prefebBond);

        bond.GetComponent <Renderer>().material = Resources.Load("_Materials/Default") as Material;

        Vector3 transformedDirection = atom1.transform.TransformDirection(new Vector3(a1Dir.x, a1Dir.y, a1Dir.z));

        bond.transform.position = Vector3.Lerp(atom1.transform.position, atom1.transform.position + transformedDirection * length, 0.5f);
        bond.transform.parent   = atom1.transform.parent;

        //bond
        Vector3 scale = prefebBond.transform.lossyScale;

        scale.y = length * 0.5f;
        bond.transform.localScale = scale;
        bond.transform.LookAt(atom1.transform.position);
        bond.transform.Rotate(new Vector3(90, 0, 0));

        //atom2
        Vector3 Atom2expectedPos = atom1.transform.position + 2 * (bond.transform.position - atom1.transform.position);

        atom2.transform.parent.transform.position += Atom2expectedPos - atom2.transform.position;
        //rotate
        Vector3 vec1 = (bond.transform.position - atom1.transform.position).normalized;
        Vector3 vec2 = (atom2.transform.TransformDirection(a2Dir)).normalized;

        float an = 180 - Vector3.Angle(vec1, vec2);

        if (vec1 == vec2)
        {
            print("rotate 180");
            Vector3 axis = CaculateUtil.GetVerticalDir(vec1);
            atom2.transform.parent.transform.RotateAround(atom2.transform.position, axis, 180);
        }
        else
        {
            atom2.transform.parent.transform.RotateAround(atom2.transform.position, Vector3.Cross(vec1, vec2), an);
        }

        MergeTwoMolecules(atom1.transform.parent.gameObject, atom2.transform.parent.gameObject);

        //set abstract bond
        Bond b = bond.AddComponent <Bond>();

        bond.AddComponent <BondsAction>();
        b.A1      = a1.gameObject;
        b.A2      = a2.gameObject;
        b.A1Index = a1Index;
        b.A2Index = a2Index;
        b.Type    = BondType.SINGLE;
        a1.addBond(bond);
        a2.addBond(bond);
    }