Advertisement
Void-voiD

Untitled

Aug 8th, 2020
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.42 KB | None | 0 0
  1. const drawBallStick = () => {
  2. let count = molecula.bonds.length;
  3. // определяем наибольшую z координату молекул для определения оптимального положения камеры
  4. let maxZ = -100;
  5. // цикл для отрисовки кадой связи молекулы
  6. for (let i = 0; i < count; i++) {
  7. // получение информации о молекулах, соединяемых текущей связью
  8. let currentBond = molecula.bonds[i];
  9. let startAtom = molecula.atoms[currentBond.atom1 - 1];
  10. let finishAtom = molecula.atoms[currentBond.atom2 - 1];
  11.  
  12. if (startAtom.coords[0] > maxZ) {
  13. maxZ = startAtom.coords[0];
  14. }
  15. if (finishAtom.coords[0] > maxZ) {
  16. maxZ = finishAtom.coords[0];
  17. }
  18.  
  19. // вычисление параметров цилиндра, изображающего связь между молекулами
  20. let x = finishAtom.coords[1] - startAtom.coords[1],
  21. y = finishAtom.coords[2] - startAtom.coords[2],
  22. z = finishAtom.coords[0] - startAtom.coords[0];
  23. let cylinderHeight = Math.sqrt(x ** 2 + y ** 2 + z ** 2);
  24. let axis = new THREE.Vector3(0, 1, 0);
  25. let direction = new THREE.Vector3(x, y, z);
  26.  
  27. // также к каждому цилиндру с обоих концов будет добавлена сфера, для закругления плоских граней и корректного отображения состывок цилндров, изображающих связи
  28. // создание первой половины цилиндра (так как разные половинки разных цветов (по цвету атома, к которому они примыкают))
  29. let geometry1 = new THREE.CylinderGeometry(radiusOfBoundCylinder, radiusOfBoundCylinder,
  30. cylinderHeight / 2, 30);
  31. let material1 = new THREE.MeshBasicMaterial({color: startAtom.atom.color});
  32. let cylinder1 = new THREE.Mesh(geometry1, material1);
  33. cylinder1.position.set(startAtom.coords[1] + x / 4, startAtom.coords[2] + y / 4, startAtom.coords[0] + z / 4);
  34. cylinder1.quaternion.setFromUnitVectors(axis, direction.clone().normalize());
  35. scene.add(cylinder1);
  36.  
  37.  
  38. // вторая половинка
  39. let geometry2 = new THREE.CylinderGeometry(radiusOfBoundCylinder, radiusOfBoundCylinder,
  40. cylinderHeight / 2, 30);
  41. let material2 = new THREE.MeshBasicMaterial({color: finishAtom.atom.color});
  42. let cylinder2 = new THREE.Mesh(geometry2, material2);
  43. cylinder2.position.set(startAtom.coords[1] + x * 0.75, startAtom.coords[2] + y * 0.75,
  44. startAtom.coords[0] + z * 0.75);
  45. cylinder2.quaternion.setFromUnitVectors(axis, direction.clone().normalize());
  46. scene.add(cylinder2);
  47. }
  48. for (let i = 0; i < molecula.atoms.length; i++){
  49. let sphereGeom = new THREE.SphereGeometry(molecula.atoms[i].atom.radius, 30, 30);
  50. let sphereMat = new THREE.MeshBasicMaterial({color: molecula.atoms[i].atom.color});
  51. let sphere = new THREE.Mesh(sphereGeom, sphereMat);
  52. sphere.position.set(molecula.atoms[i].coords[1], molecula.atoms[i].coords[2], molecula.atoms[i].coords[0]);
  53. scene.add(sphere);
  54. }
  55. // стартовая позиция камеры
  56. camera.position.z = maxZ + 1;
  57. // исправление бага с размытосью первоначальной отрисовки молекулы
  58. window.innerHeight += 1;
  59. }
  60.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement