Advertisement
Void-voiD

Untitled

Aug 7th, 2020
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.39 KB | None | 0 0
  1. let scene, camera, renderer, width, height, radiusOfBoundCylinder = 0.1, controls;
  2.  
  3.  
  4. const initThreeJS = () => {
  5. // создание сцены, ее настройка
  6. scene = new THREE.Scene();
  7. width = window.innerWidth * 0.8;
  8. height = window.innerHeight * 0.7;
  9. camera = new THREE.PerspectiveCamera(90, width / height, 0.001, 25);
  10. renderer = new THREE.WebGLRenderer({canvas: glcanvas});
  11.  
  12. function resize() {
  13. if (window.innerWidth * 0.8 !== width || window.innerHeight * 0.7 !== height) {
  14. width = window.innerWidth * 0.8;
  15. height = window.innerHeight * 0.7;
  16. renderer.setSize(width, height, false);
  17. camera.aspect = width / height;
  18. camera.updateProjectionMatrix();
  19. }
  20. }
  21. function render() {
  22. resize();
  23. renderer.render(scene, camera);
  24. requestAnimationFrame(render);
  25. }
  26. render();
  27.  
  28. let delta = 0.05;
  29. let xAxis = new THREE.Vector3(1, 0, 0);
  30. let yAxis = new THREE.Vector3(0, 1, 0);
  31. let zAxis = new THREE.Vector3(0, 0, 1);
  32. // управление камерой
  33. // w - вперед, s - назад
  34. // a - влево, d - вправо
  35. // q - вниз, e - вверх
  36. window.addEventListener('keydown', function(event) {
  37. event.preventDefault();
  38. switch (event.keyCode) {
  39. // w
  40. case 87:
  41. camera.translateOnAxis(zAxis, -delta);
  42. break;
  43. // s
  44. case 83:
  45. camera.translateOnAxis(zAxis, delta);
  46. break;
  47. // a
  48. case 65:
  49. camera.translateOnAxis(xAxis, delta);
  50. break;
  51. // d
  52. case 68:
  53. camera.translateOnAxis(xAxis, -delta);
  54. break;
  55. // q
  56. case 81:
  57. camera.translateOnAxis(yAxis, delta);
  58. break;
  59. // e
  60. case 69:
  61. camera.translateOnAxis(yAxis, -delta);
  62. break;
  63. }
  64. });
  65. }
  66.  
  67.  
  68. const drawMoleculaStick = () => {
  69. let count = molecula.bonds.length;
  70. // определяем наибольшую z координату молекул для определения оптимального положения камеры
  71. let maxZ = -100;
  72. // цикл для отрисовки кадой связи молекулы
  73. for (let i = 0; i < count; i++) {
  74. // получение информации о молекулах, соединяемых текущей связью
  75. let currentBond = molecula.bonds[i];
  76. let startAtom = molecula.atoms[currentBond.atom1 - 1];
  77. let finishAtom = molecula.atoms[currentBond.atom2 - 1];
  78.  
  79. if (startAtom.coords[2] > maxZ) {
  80. maxZ = startAtom.coords[2];
  81. }
  82. if (finishAtom.coords[2] > maxZ) {
  83. maxZ = finishAtom.coords[2];
  84. }
  85.  
  86. // вычисление параметров цилиндра, изображающего связь между молекулами
  87. console.log(startAtom.coords[0], startAtom.coords[1], startAtom.coords[2]);
  88. console.log(finishAtom.coords[0], finishAtom.coords[1], finishAtom.coords[2]);
  89. let x = finishAtom.coords[0] - startAtom.coords[0],
  90. y = finishAtom.coords[1] - startAtom.coords[1],
  91. z = finishAtom.coords[2] - startAtom.coords[2];
  92. let cylinderHeight = Math.sqrt(x ** 2 + y ** 2 + z ** 2);
  93. let angleX = Math.acos(Math.abs(x) / cylinderHeight);
  94. let angleY = Math.acos(Math.abs(y) / cylinderHeight);
  95. let angleZ = Math.acos(Math.abs(z) / cylinderHeight);
  96.  
  97. // создание первой половины цилиндра (так как разные половинки разных цветов (по цвету атома, к которому они примыкают))
  98. let geometry1 = new THREE.CylinderGeometry(radiusOfBoundCylinder, radiusOfBoundCylinder,
  99. cylinderHeight / 2, 30, 1, true);
  100. let material1 = new THREE.MeshBasicMaterial({color: startAtom.atom.color});
  101. let cylinder1 = new THREE.Mesh(geometry1, material1);
  102. cylinder1.position.set(startAtom.coords[0], startAtom.coords[1], startAtom.coords[2]);
  103. cylinder1.rotation.set(angleX, angleY, angleZ);
  104. scene.add(cylinder1);
  105.  
  106. // вторая половинка
  107. let geometry2 = new THREE.CylinderGeometry(radiusOfBoundCylinder, radiusOfBoundCylinder,
  108. cylinderHeight / 2, 30, 1, true);
  109. let material2 = new THREE.MeshBasicMaterial({color: finishAtom.atom.color});
  110. let cylinder2 = new THREE.Mesh(geometry2, material2);
  111. cylinder2.position.set(startAtom.coords[0] + x / 2, startAtom.coords[1] + y / 2, startAtom.coords[2] + z / 2);
  112. cylinder1.rotation.set(angleX, angleY, angleZ);
  113. scene.add(cylinder2);
  114. }
  115. // стартовая позиция камеры
  116. camera.position.z = maxZ + 0.5;
  117. }
  118.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement