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