Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var WIDTH = window.innerWidth;
- var HEIGHT = window.innerHeight;
- var mouse = new THREE.Vector2();
- var renderer = new THREE.WebGLRenderer({antialias: true});
- renderer.setSize(WIDTH, HEIGHT);
- renderer.setClearColor(0xDDDDDD, 1);
- document.body.appendChild(renderer.domElement);
- var scene = new THREE.Scene();
- var camera = new THREE.PerspectiveCamera(45, WIDTH / HEIGHT, 0.1, 10000);
- camera.position.set(0, 0, 10);
- scene.add(camera);
- var light = new THREE.PointLight(0xFFFFFF);
- light.position.set(-10, 15, 50);
- scene.add(light);
- var request = new XMLHttpRequest();
- request.open("GET", "Aspirin.json", false);
- request.send(null);
- molecule_data = JSON.parse(request.responseText);
- ///////////////////////////////////////////////////////////////////////////////////////////
- var molecule = new THREE.Object3D();
- var k = 0.4;
- //массивы для атомов, материалов и геометрий
- var atoms = [], materials = [], geometries = [];
- atoms['H'] = [0, 0x2a52be, 0.53];
- atoms['O'] = [1, 0xff0000, 0.60];
- atoms['C'] = [2, 0x00ff12, 0.91];
- // TODO:--------------- atoms2 заполнен аналогично 3 строкам выше ---------------------------------------------
- var atoms2 = [];
- var typesOfAtoms = new Set(molecule_data["PC_Compounds"][0]["atoms"]["element"]);
- var j = 0;
- for (let type of typesOfAtoms){
- var color = Number('0x'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6));
- var name = type.toString() + 'element';
- atoms2[name] = [j,color,molecule_data["PC_Compounds"][0]["coords"][0]["type"][j]/7];
- j+=1;
- }
- atoms_old = atoms;
- atoms = atoms2; //меняю старый на новый
- // --------------------------------------------------------------------------------------------------------------
- //объявление материалов и геометрий этих атомов
- for (var Name in atoms) {
- var material = new THREE.MeshPhongMaterial({
- color: atoms[Name][1], specular: 0x00b2fc, shininess: 90,
- blending: THREE.NormalBlending, depthTest: true
- }
- );
- materials.push(material);
- var geometry = new THREE.SphereGeometry(atoms[Name][2] * k, 64, 64);
- geometries.push(geometry);
- }
- //информация о координатах молекулы
- var bond_arr = [];
- j = 0;
- for (i = 0; i < molecule_data["PC_Compounds"][0]["atoms"]["aid"].length; i++) {
- bond = [];
- while (molecule_data["PC_Compounds"][0]["bonds"]["aid1"][j] === i + 1) {
- bond.push(molecule_data["PC_Compounds"][0]["bonds"]["aid2"][j]);
- j += 1;
- }
- if (bond_arr.length >= 1){
- for (var s = 0; s < i ; s++){
- if (bond_arr[s].indexOf(i+1)!== -1){
- bond.push(s+1)
- }
- }
- }
- bond_arr.push(bond);
- }
- order = [];
- for (i = 0; i < molecule_data["PC_Compounds"][0]["bonds"]["aid1"].length; i++){
- var n1 = molecule_data["PC_Compounds"][0]["bonds"]["aid1"][i];
- var n2 = molecule_data["PC_Compounds"][0]["bonds"]["aid2"][i];
- order[n1.toString() + ' ' + n2.toString()] = molecule_data["PC_Compounds"][0]["bonds"]["order"][i];
- }
- var info2 = [];
- j = 0;
- for (i = 0; i < molecule_data["PC_Compounds"][0]["atoms"]["aid"].length; i++) {
- bond = bond_arr[i].toString().replace(/,/g, ' ');
- var num = (i+1).toString();
- var elem = molecule_data["PC_Compounds"][0]["atoms"]["element"][i].toString() + "element";
- var x = molecule_data["PC_Compounds"][0]["coords"][0]["conformers"][0]["x"][i].toString();
- var y = molecule_data["PC_Compounds"][0]["coords"][0]["conformers"][0]["y"][i].toString();
- var z = molecule_data["PC_Compounds"][0]["coords"][0]["conformers"][0]["z"][i].toString();
- info2.push(num + " " + elem + " " + x + " " + y + " "+ z + " " + bond )
- }
- var info = [];
- info.push('1 C -0.231579 -0.350841 -0.037475 2 4 5 6');
- info.push('2 C 0.229441 -0.373160 1.224850 1 3 7 8');
- info.push('3 O 0.868228 -0.551628 2.114423 2 9');
- info.push('4 H 0.619613 -0.833754 -0.565710 1');
- info.push('5 H -0.709445 0.352087 -0.754607 1');
- info.push('6 H -0.976393 -1.144198 0.191635 1');
- info.push('7 H -0.628785 0.860022 1.736350 2');
- info.push('8 H 0.952253 1.174538 0.962081 2');
- info.push('9 H 0.204846 -1.119563 2.483509 3');
- info = info2;
- // info.push('1 C -0.231579 -0.350841 -0.037475 2');
- // info.push('2 C 0.229441 -0.373160 1.224850 1 3');
- // info.push('3 C 0.204846 -1.119563 2.483509 2');
- //добавляем информацию в виде массива
- var arr = [];
- for (var i = 0; i < info.length; i++) {
- arr[i] = info[i].match(/\S+/g);
- }
- //выводим все атомы
- for (var i = 0; i < arr.length; i++) {
- var Name = arr[i][1]; //номер элемента
- var Punct = new THREE.Mesh(geometries[atoms[Name][0]], materials[atoms[Name][0]]);
- Punct.position.set(arr[i][2], arr[i][3], arr[i][4]);
- molecule.add(Punct);
- }
- //соединяем точки pointX и pointY цилиндром
- function cylinderMesh(pointX, pointY) {
- var direction = new THREE.Vector3().subVectors(pointX, pointY);
- var arrow = new THREE.ArrowHelper(
- direction.clone().normalize(), pointX, direction.length());
- var edgeGeometry = new THREE.CylinderGeometry(0.03, 0.03, direction.length(), 36, 4);
- var edgeMesh = new THREE.Mesh(edgeGeometry, new THREE.MeshBasicMaterial({color: 0x0000ff}));
- edgeMesh.position.set(
- (pointX.getComponent(0) + pointY.getComponent(0)) / 2,
- (pointX.getComponent(1) + pointY.getComponent(1)) / 2,
- (pointX.getComponent(2) + pointY.getComponent(2)) / 2);
- edgeMesh.setRotationFromEuler(arrow.rotation);
- return edgeMesh;
- }
- //соединяем атом с номером в начале массива с атомами, номера которых стоят на 5 и далее местах
- for (i = 0; i < arr.length; i++) {
- var num = arr[i][0] - 1; //номер атома
- var x1 = parseFloat(arr[num][2]);
- var y1 = parseFloat(arr[num][3]);
- var z1 = parseFloat(arr[num][4]);
- for (j = 5; j < arr[i].length; j++) {
- // if (arr[i][j]<num) break;
- // var num2 = arr[i][j] - 1; //номер атома
- // var x2 = (parseFloat(arr[num2][2]));
- // var y2 = (parseFloat(arr[num2][3]));
- // var z2 = (parseFloat(arr[num2][4]));
- var num2 = arr[i][j] - 1; //номер атома
- var x2 = (parseFloat(arr[num2][2]) + x1) / 2;
- var y2 = (parseFloat(arr[num2][3]) + y1) / 2;
- var z2 = (parseFloat(arr[num2][4]) + z1) / 2;
- ord = (num+1).toString() + ' ' + (num2+1).toString();
- ord_reverse = (num2+1).toString() + ' ' + (num+1).toString();
- if ((order[ord] === 1) || (order[ord_reverse] === 1)) {
- var Vec1 = new THREE.Vector3(x1, y1, z1);
- var Vec2 = new THREE.Vector3(x2, y2, z2);
- var fingerLength = cylinderMesh(Vec1, Vec2);
- fingerLength.material = materials[atoms[arr[i][1]][0]];
- molecule.add(fingerLength);
- }
- if ((order[ord] === 2) || (order[ord_reverse] === 2)) {
- var Vec1 = new THREE.Vector3(x1-0.1, y1-0.1, z1-0.1);
- var Vec2 = new THREE.Vector3(x2-0.1, y2-0.1, z2-0.1);
- var fingerLength = cylinderMesh(Vec1, Vec2);
- fingerLength.material = materials[atoms[arr[i][1]][0]];
- molecule.add(fingerLength);
- var Vec1 = new THREE.Vector3(x1+0.1, y1+0.1, z1+0.1);
- var Vec2 = new THREE.Vector3(x2+0.1, y2+0.1, z2+0.1);
- var fingerLength = cylinderMesh(Vec1, Vec2);
- fingerLength.material = materials[atoms[arr[i][1]][0]];
- molecule.add(fingerLength);
- }
- }
- }
- scene.add(molecule);
- /////////////////////////////////////////////////////////////////////
- var rotationSpeed = 6;
- var scaleSpeed = 1;
- var isMouseDown = false;
- document.addEventListener('mousemove', onDocumentMouseMove, false);
- document.addEventListener('mousedown', onDocumentMouseDown, false);
- document.addEventListener('mouseup', onDocumentMouseUp, false);
- document.addEventListener('mousewheel', onDocumentMouseWheel, false);
- function moleculeMove() {
- var radiansX = Math.atan(mouse.x - molecule.rotation.y);
- var radiansY = Math.atan(mouse.y - molecule.rotation.x);
- molecule.rotation.x = molecule.rotation.x + radiansY;
- molecule.rotation.y = molecule.rotation.y + radiansX;
- }
- function onDocumentMouseWheel(event) {
- event.preventDefault();
- var s = Math.sign(event.wheelDeltaY);
- if ((camera.position.z + s * scaleSpeed) > 0) {
- camera.position.z += s * scaleSpeed;
- } else {
- camera.position.z = scaleSpeed;
- event.wheelDeltaY = 0;
- }
- }
- function onDocumentMouseDown(event) {
- event.preventDefault();
- isMouseDown = true;
- }
- function onDocumentMouseUp(event) {
- event.preventDefault();
- isMouseDown = false;
- }
- function onDocumentMouseMove(event) {
- event.preventDefault();
- if (isMouseDown) {
- mouse.x = -(event.clientX / window.innerWidth) * rotationSpeed;
- mouse.y = (event.clientY / window.innerHeight) * rotationSpeed;
- }
- }
- function render() {
- requestAnimationFrame(render);
- moleculeMove();
- light.position = camera.position;
- renderer.render(scene, camera);
- }
- render();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement