Advertisement
Void-voiD

Untitled

Aug 7th, 2020
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 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. // шаг для перемещения
  29. let delta = 0.05;
  30. // шан для поворота
  31. let theta = Math.PI / 36;
  32.  
  33. // задание омей координат
  34. let xAxis = new THREE.Vector3(1, 0, 0);
  35. let yAxis = new THREE.Vector3(0, 1, 0);
  36. let zAxis = new THREE.Vector3(0, 0, 1);
  37.  
  38. // управление камерой
  39. // w - вперед, s - назад
  40. // a - влево, d - вправо
  41. // q - вниз, e - вверх
  42. // вращение камерой по осям (в одну/другую сторону)- z/x, c/v, b/n
  43. window.addEventListener('keydown', function(event) {
  44. event.preventDefault();
  45. switch (event.keyCode) {
  46. // w
  47. case 87:
  48. camera.translateOnAxis(zAxis, -delta);
  49. break;
  50. // s
  51. case 83:
  52. camera.translateOnAxis(zAxis, delta);
  53. break;
  54. // a
  55. case 65:
  56. camera.translateOnAxis(xAxis, delta);
  57. break;
  58. // d
  59. case 68:
  60. camera.translateOnAxis(xAxis, -delta);
  61. break;
  62. // q
  63. case 81:
  64. camera.translateOnAxis(yAxis, delta);
  65. break;
  66. // e
  67. case 69:
  68. camera.translateOnAxis(yAxis, -delta);
  69. break;
  70.  
  71. // z
  72. case 90:
  73. camera.rotateOnAxis(xAxis, theta);
  74. break;
  75. // x
  76. case 88:
  77. camera.rotateOnAxis(xAxis, -theta);
  78. break;
  79. // c
  80. case 67:
  81. camera.rotateOnAxis(yAxis, theta);
  82. break;
  83. // v
  84. case 86:
  85. camera.rotateOnAxis(yAxis, -theta);
  86. break;
  87. // b
  88. case 66:
  89. camera.rotateOnAxis(zAxis, theta);
  90. break;
  91. // n
  92. case 78:
  93. camera.rotateOnAxis(zAxis, -theta);
  94. break;
  95. }
  96. });
  97. }
  98.  
  99.  
  100. const drawMoleculaStick = () => {
  101. let count = molecula.bonds.length;
  102. // определяем наибольшую z координату молекул для определения оптимального положения камеры
  103. let maxZ = -100;
  104. // цикл для отрисовки кадой связи молекулы
  105. for (let i = 0; i < count; i++) {
  106. // получение информации о молекулах, соединяемых текущей связью
  107. let currentBond = molecula.bonds[i];
  108. let startAtom = molecula.atoms[currentBond.atom1 - 1];
  109. let finishAtom = molecula.atoms[currentBond.atom2 - 1];
  110.  
  111. if (startAtom.coords[2] > maxZ) {
  112. maxZ = startAtom.coords[2];
  113. }
  114. if (finishAtom.coords[2] > maxZ) {
  115. maxZ = finishAtom.coords[2];
  116. }
  117.  
  118. // вычисление параметров цилиндра, изображающего связь между молекулами
  119. console.log(startAtom.coords[0], startAtom.coords[1], startAtom.coords[2]);
  120. console.log(finishAtom.coords[0], finishAtom.coords[1], finishAtom.coords[2]);
  121. let x = finishAtom.coords[0] - startAtom.coords[0],
  122. y = finishAtom.coords[1] - startAtom.coords[1],
  123. z = finishAtom.coords[2] - startAtom.coords[2];
  124. let cylinderHeight = Math.sqrt(x ** 2 + y ** 2 + z ** 2);
  125. let angleX = Math.acos(Math.abs(x) / cylinderHeight);
  126. let angleY = Math.acos(Math.abs(y) / cylinderHeight);
  127. let angleZ = Math.acos(Math.abs(z) / cylinderHeight);
  128.  
  129. // создание первой половины цилиндра (так как разные половинки разных цветов (по цвету атома, к которому они примыкают))
  130. let geometry1 = new THREE.CylinderGeometry(radiusOfBoundCylinder, radiusOfBoundCylinder,
  131. cylinderHeight / 2, 30, 1, true);
  132. let material1 = new THREE.MeshBasicMaterial({color: startAtom.atom.color});
  133. let cylinder1 = new THREE.Mesh(geometry1, material1);
  134. cylinder1.position.set(startAtom.coords[0] + x / 4, startAtom.coords[1] + y / 4, startAtom.coords[2] + z / 4);
  135. cylinder1.rotation.set(angleX, angleY, angleZ);
  136. scene.add(cylinder1);
  137.  
  138. // вторая половинка
  139. let geometry2 = new THREE.CylinderGeometry(radiusOfBoundCylinder, radiusOfBoundCylinder,
  140. cylinderHeight / 2, 30, 1, true);
  141. let material2 = new THREE.MeshBasicMaterial({color: finishAtom.atom.color});
  142. let cylinder2 = new THREE.Mesh(geometry2, material2);
  143. cylinder2.position.set(startAtom.coords[0] + x * 0.75, startAtom.coords[1] + y * 0.75,
  144. startAtom.coords[2] + z * 0.75);
  145. cylinder1.rotation.set(angleX, angleY, angleZ);
  146. scene.add(cylinder2);
  147. }
  148. // стартовая позиция камеры
  149. camera.position.z = maxZ + 0.5;
  150. }
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement