Редактирование: Мещерский Задача 6.11
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 21: | Строка 21: | ||
<html> | <html> | ||
<head> | <head> | ||
− | + | <script src ="http://tm.spbstu.ru/htmlets/Lobanov_I_Y/JS_files/three.js"></script> | |
− | + | <script src ="http://tm.spbstu.ru/htmlets/Lobanov_I_Y/JS_files/stats.min.js"></script> | |
− | + | <script src ="http://tm.spbstu.ru/htmlets/Lobanov_I_Y/JS_files/OrbitControls.js"></script> | |
− | + | <script src ="http://tm.spbstu.ru/htmlets/Lobanov_I_Y/JS_files/dat.gui.js"></script> | |
</head> | </head> | ||
<body> | <body> | ||
Строка 31: | Строка 31: | ||
<script> | <script> | ||
− | var scene, | + | var scene, //Сцена. |
− | camera, | + | camera, //Камера. |
− | renderer; | + | renderer; //Рендер. |
− | var LENGTH_AB = 20; | + | var LENGTH_AB = 20; //Длина стойки AB. |
− | var RADIUS_RACK = 1; | + | var RADIUS_RACK = 1; //Радиус стойки. |
− | var statFPS; | + | var statFPS; //Объект, для вывода информации о текущем FPS. |
− | var panelControlOptions; | + | var panelControlOptions; //Объект, через которую изменяется угол альфа и вес груза, а так же возможность отображения усилий. |
− | var panelInfoEffort; | + | var panelInfoEffort; //Объект, через который выводим информацию об усилиях. |
− | var gui; | + | var gui; //Панель с интерфейсом. |
//Стойка AB. | //Стойка AB. | ||
− | var geometryRackAB, | + | var geometryRackAB, //Геометрическая фигура. |
− | materialRackAB, | + | materialRackAB, //Материал. |
− | meshRackAB, | + | meshRackAB, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorRackAB = {color: 0x6A5ACD}; | + | colorRackAB = {color: 0x6A5ACD}; //Цвет. |
//Стойка BD. | //Стойка BD. | ||
− | var geometryRackBD, | + | var geometryRackBD, //Геометрическая фигура. |
− | materialRackBD, | + | materialRackBD, //Материал. |
− | meshRackBD, | + | meshRackBD, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorRackBD = {color: 0x6A5ACD}; | + | colorRackBD = {color: 0x6A5ACD}; //Цвет. |
//Стойка BE. | //Стойка BE. | ||
− | var geometryRackBE, | + | var geometryRackBE, //Геометрическая фигура. |
− | materialRackBE, | + | materialRackBE, //Материал. |
− | meshRackBE, | + | meshRackBE, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorRackBE = {color: 0x6A5ACD}; | + | colorRackBE = {color: 0x6A5ACD}; //Цвет. |
+ | |||
//Стойка AC. | //Стойка AC. | ||
− | var geometryRackAC, | + | var geometryRackAC, //Геометрическая фигура. |
− | materialRackAC, | + | materialRackAC, //Материал. |
− | meshRackAC, | + | meshRackAC, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorRackAC = {color: 0x6A5ACD}; | + | colorRackAC = {color: 0x6A5ACD}; //Цвет. |
//Шарнир в точке B. | //Шарнир в точке B. | ||
− | var geometryHingeB, | + | var geometryHingeB, //Геометрическая фигура. |
− | materialHingeB, | + | materialHingeB, //Материал. |
− | meshHingeB, | + | meshHingeB, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorHingeB = {color: 0x6A5ACD}; | + | colorHingeB = {color: 0x6A5ACD}; //Цвет. |
//Шарнир в точке A. | //Шарнир в точке A. | ||
− | var geometryHingeA, | + | var geometryHingeA, //Геометрическая фигура. |
− | materialHingeA, | + | materialHingeA, //Материал. |
− | meshHingeA, | + | meshHingeA, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorHingeA = {color: 0x6A5ACD}; | + | colorHingeA = {color: 0x6A5ACD}; //Цвет. |
//Шарнир в точке D. | //Шарнир в точке D. | ||
− | var geometryHingeD, | + | var geometryHingeD, //Геометрическая фигура. |
− | materialHingeD, | + | materialHingeD, //Материал. |
− | meshHingeD, | + | meshHingeD, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorHingeD = {color: 0x6A5ACD}; | + | colorHingeD = {color: 0x6A5ACD}; //Цвет. |
//Шарнир в точке E. | //Шарнир в точке E. | ||
− | var geometryHingeE, | + | var geometryHingeE, //Геометрическая фигура. |
− | materialHingeE, | + | materialHingeE, //Материал. |
− | meshHingeE, | + | meshHingeE, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorHingeE = {color: 0x6A5ACD}; | + | colorHingeE = {color: 0x6A5ACD}; //Цвет. |
//Трос. | //Трос. | ||
− | var geometryCableBCP, | + | var geometryCableBCP, //Геометрическая фигура. |
− | materialCableBCP, | + | materialCableBCP, //Материал. |
− | meshCableBCP, | + | meshCableBCP, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorCableBCP = {color: 0x000000}; | + | colorCableBCP = {color: 0x000000}; //Цвет. |
− | //Наконечник | + | //Наконечник стоки AC. |
− | var geometryEndRackAC, | + | var geometryEndRackAC, //Геометрическая фигура. |
− | materialEndRackAC, | + | materialEndRackAC, //Материал. |
− | meshEndRackAC, | + | meshEndRackAC, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorEndRackAC = {color: 0x6A5ACD}; | + | colorEndRackAC = {color: 0x6A5ACD}; //Цвет. |
//Груз. | //Груз. | ||
− | var geometryCargoP, | + | var geometryCargoP, //Геометрическая фигура. |
− | materialCargoP, | + | materialCargoP, //Материал. |
− | meshCargoP, | + | meshCargoP, //Объект сцены (на геом. фигуру накладываем материал). |
− | colorCargoP = {color: 0xFF4500}; | + | colorCargoP = {color: 0xFF4500}; //Цвет. |
− | |||
− | |||
− | |||
− | |||
+ | //Вектор усилия опоры AB. | ||
+ | var vectorEffortAB, //Вектор. | ||
+ | colorEffortAB = 0xFF0000; //Цвет. | ||
− | var vectorEffortBD, | + | //Вектор усилия опоры BD. |
− | colorEffortBD = 0xFF0000; | + | var vectorEffortBD, //Вектор. |
+ | colorEffortBD = 0xFF0000; //Цвет. | ||
− | + | //Вектор усилия опоры BE. | |
− | var vectorEffortBE, | + | var vectorEffortBE, //Вектор. |
− | colorEffortBE = 0xFF0000; | + | colorEffortBE = 0xFF0000; //Цвет. |
− | //Функции инициализации | + | //Функции инициализации, которая создает необходимые объекты. Для работы приложения. |
function init() { | function init() { | ||
− | scene = new THREE.Scene(); | + | scene = new THREE.Scene(); //Создаем сцену. |
− | camera = new THREE.PerspectiveCamera(100, window.innerWidth / window.innerHeight, 0.1, 100); | + | camera = new THREE.PerspectiveCamera(100, window.innerWidth / window.innerHeight, 0.1, 100); //Добавляем камеру (точка с которой смотрит на сцену пользователь). |
− | renderer = new THREE.WebGLRenderer(); | + | renderer = new THREE.WebGLRenderer(); //Создаем WebGL-рендер. |
− | renderer.setSize(window.innerWidth, window.innerHeight); | + | renderer.setSize(window.innerWidth, window.innerHeight); //Задаем размеры рендера. |
− | renderer.setClearColor(0xEEEEEE); | + | renderer.setClearColor(0xEEEEEE); //Задем цвет фона (серый цвет). |
//renderer.shadowMap.enabled=true; | //renderer.shadowMap.enabled=true; | ||
− | document.getElementById("WebGL").appendChild(renderer.domElement); | + | document.getElementById("WebGL").appendChild(renderer.domElement); //Добавляем рендер на страницу. |
+ | //Задаем позицию камеры. | ||
camera.position.x = 0; | camera.position.x = 0; | ||
camera.position.y = 0; | camera.position.y = 0; | ||
Строка 137: | Строка 139: | ||
camera.lookAt(0, 0, 0); | camera.lookAt(0, 0, 0); | ||
− | axes = new THREE.AxisHelper(50); | + | axes = new THREE.AxisHelper(50); //Создаем оси координат. |
− | scene.add(axes); | + | scene.add(axes); //Добавляем оси координат на сцену. |
− | control = new THREE.OrbitControls(camera,renderer.domElement); | + | control = new THREE.OrbitControls(camera,renderer.domElement); //Добавляем управление мышью (маштаб и ракурс обзора). |
+ | //Создали объект через который меняем угол альфа и вес груза, а так же отображение усилий. | ||
panelControlOptions = new function() { | panelControlOptions = new function() { | ||
− | this.alpha = 0.0; | + | this.alpha = 0.0; //Угол альфа. |
− | this.weightP = 10.0; | + | this.weightP = 10.0; //Вес груза. |
− | this.visibleEffort = true; | + | this.visibleEffort = true; //Отображения усилий. |
} | } | ||
+ | //Создали объект, через который выводим информацию об усилиях. | ||
panelInfoEffort = new function() { | panelInfoEffort = new function() { | ||
this.Sbd = '0'; | this.Sbd = '0'; | ||
Строка 153: | Строка 157: | ||
this.Sab = '0'; | this.Sab = '0'; | ||
} | } | ||
− | gui = new dat.GUI(); | + | gui = new dat.GUI(); //Создали панель. |
+ | //Добавили на панель возможность изменять угол. При изменения вызывается функция перерисовки сцены. | ||
gui.add(panelControlOptions, 'alpha', -90, 90).onChange(redrawCraneElements); | gui.add(panelControlOptions, 'alpha', -90, 90).onChange(redrawCraneElements); | ||
+ | //Добавили на панель возможность изменять вес груза. При изменения вызывается функция перерисовки сцены. | ||
gui.add(panelControlOptions, 'weightP', 1, 100).onChange(redrawCraneElements); | gui.add(panelControlOptions, 'weightP', 1, 100).onChange(redrawCraneElements); | ||
+ | //Добавили на панель возможность показа/скрытия усилий. При изменения вызывается функция перерисовки сцены. | ||
gui.add(panelControlOptions, 'visibleEffort').onChange(redrawCraneElements); | gui.add(panelControlOptions, 'visibleEffort').onChange(redrawCraneElements); | ||
+ | //Добавили на панель вывод усилий стоек. | ||
gui.add(panelInfoEffort, 'Sbd').listen(); | gui.add(panelInfoEffort, 'Sbd').listen(); | ||
gui.add(panelInfoEffort, 'Sbe').listen(); | gui.add(panelInfoEffort, 'Sbe').listen(); | ||
gui.add(panelInfoEffort, 'Sab').listen(); | gui.add(panelInfoEffort, 'Sab').listen(); | ||
− | drawStaticCraneElements(); | + | drawStaticCraneElements(); //Добавление статичных элементов крана на сцену. |
− | drawDynamicCraneElements(); | + | drawDynamicCraneElements(); //Добавление динамических элементов крана на сцену. |
statFPS = initStatFPS(); | statFPS = initStatFPS(); | ||
− | render(); | + | render(); //Отрисовываем сцену. |
+ | //Повешали обработчик на событие: изменение размеров окна. | ||
window.addEventListener('resize',changeSizeWindow,false); | window.addEventListener('resize',changeSizeWindow,false); | ||
} | } | ||
+ | //Функция добавления статичный элементов крана на сцену. | ||
function drawStaticCraneElements() { | function drawStaticCraneElements() { | ||
− | geometryRackAB = new THREE.CylinderGeometry(RADIUS_RACK, RADIUS_RACK, LENGTH_AB, 32); | + | //Создаем стойку AB. |
− | materialRackAB = new THREE.MeshBasicMaterial(colorRackAB); | + | geometryRackAB = new THREE.CylinderGeometry(RADIUS_RACK, RADIUS_RACK, LENGTH_AB, 32); //Создаем фигуру (цилиндр). |
− | meshRackAB = new THREE.Mesh(geometryRackAB, materialRackAB); | + | materialRackAB = new THREE.MeshBasicMaterial(colorRackAB); //Создаем материал. |
+ | meshRackAB = new THREE.Mesh(geometryRackAB, materialRackAB); //Создаем объект сцены. | ||
+ | //Задаем положение центра стойки. | ||
meshRackAB.position.x = 0; | meshRackAB.position.x = 0; | ||
meshRackAB.position.y = LENGTH_AB / 2; | meshRackAB.position.y = LENGTH_AB / 2; | ||
meshRackAB.position.z = 0; | meshRackAB.position.z = 0; | ||
+ | //Помещаем стойку на сцену. | ||
scene.add(meshRackAB); | scene.add(meshRackAB); | ||
− | geometryRackBD = new THREE.CylinderGeometry(RADIUS_RACK, RADIUS_RACK, Math.sqrt(2) * LENGTH_AB, 32); | + | //Создаем стойку BD. |
− | materialRackBD = new THREE.MeshBasicMaterial(colorRackBD); | + | geometryRackBD = new THREE.CylinderGeometry(RADIUS_RACK, RADIUS_RACK, Math.sqrt(2) * LENGTH_AB, 32); //Создаем фигуру (цилиндр). |
− | meshRackBD = new THREE.Mesh(geometryRackBD, materialRackBD); | + | materialRackBD = new THREE.MeshBasicMaterial(colorRackBD); //Создаем материал. |
+ | meshRackBD = new THREE.Mesh(geometryRackBD, materialRackBD); //Создаем объект сцены. | ||
+ | //Задаем положение центра стойки. | ||
meshRackBD.position.x = -Math.cos(Math.PI / 4) * (LENGTH_AB / 2); | meshRackBD.position.x = -Math.cos(Math.PI / 4) * (LENGTH_AB / 2); | ||
meshRackBD.position.y = LENGTH_AB / 2; | meshRackBD.position.y = LENGTH_AB / 2; | ||
meshRackBD.position.z = Math.sin(Math.PI / 4) * (LENGTH_AB / 2); | meshRackBD.position.z = Math.sin(Math.PI / 4) * (LENGTH_AB / 2); | ||
+ | //Задаем углы поворота стойки. | ||
meshRackBD.rotation.y = Math.PI / 4; | meshRackBD.rotation.y = Math.PI / 4; | ||
meshRackBD.rotation.z = -Math.PI / 4; | meshRackBD.rotation.z = -Math.PI / 4; | ||
+ | //Помещаем стойку на сцену. | ||
scene.add(meshRackBD); | scene.add(meshRackBD); | ||
− | geometryRackBE = new THREE.CylinderGeometry(RADIUS_RACK, RADIUS_RACK, Math.sqrt(2) * LENGTH_AB, 32); | + | //Создаем стойку BE. |
− | materialRackBE = new THREE.MeshBasicMaterial(colorRackBE); | + | geometryRackBE = new THREE.CylinderGeometry(RADIUS_RACK, RADIUS_RACK, Math.sqrt(2) * LENGTH_AB, 32); //Создаем фигуру (цилиндр). |
− | meshRackBE = new THREE.Mesh(geometryRackBE, materialRackBE); | + | materialRackBE = new THREE.MeshBasicMaterial(colorRackBE); //Создаем материал. |
+ | meshRackBE = new THREE.Mesh(geometryRackBE, materialRackBE); //Создаем объект сцены. | ||
+ | //Задаем положение центра стойки. | ||
meshRackBE.position.x = -Math.cos(Math.PI / 4) * (LENGTH_AB / 2); | meshRackBE.position.x = -Math.cos(Math.PI / 4) * (LENGTH_AB / 2); | ||
meshRackBE.position.y = LENGTH_AB / 2; | meshRackBE.position.y = LENGTH_AB / 2; | ||
meshRackBE.position.z = -Math.sin(Math.PI / 4) * (LENGTH_AB / 2); | meshRackBE.position.z = -Math.sin(Math.PI / 4) * (LENGTH_AB / 2); | ||
+ | //Задаем углы поворота стойки. | ||
meshRackBE.rotation.y = -Math.PI / 4; | meshRackBE.rotation.y = -Math.PI / 4; | ||
meshRackBE.rotation.z = -Math.PI / 4; | meshRackBE.rotation.z = -Math.PI / 4; | ||
+ | //Помещаем стойку на сцену. | ||
scene.add(meshRackBE); | scene.add(meshRackBE); | ||
− | geometryHingeB = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); | + | //Создаем шарнир в точке B. |
− | materialHingeB = new THREE.MeshBasicMaterial(colorHingeB); | + | geometryHingeB = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); //Создаем фигуру (сфера). |
− | meshHingeB = new THREE.Mesh(geometryHingeB, materialHingeB); | + | materialHingeB = new THREE.MeshBasicMaterial(colorHingeB); //Создаем материал. |
+ | meshHingeB = new THREE.Mesh(geometryHingeB, materialHingeB); //Создаем объект сцены. | ||
+ | //Задаем положение центра шарнира. | ||
meshHingeB.position.y = LENGTH_AB; | meshHingeB.position.y = LENGTH_AB; | ||
+ | //Помещаем шарнир на сцену. | ||
scene.add(meshHingeB); | scene.add(meshHingeB); | ||
− | geometryHingeA = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); | + | //Создаем шарнир в точке A. |
− | materialHingeA = new THREE.MeshBasicMaterial(colorHingeA); | + | geometryHingeA = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); //Создаем фигуру (сфера). |
− | meshHingeA = new THREE.Mesh(geometryHingeA, materialHingeA); | + | materialHingeA = new THREE.MeshBasicMaterial(colorHingeA); //Создаем материал. |
+ | meshHingeA = new THREE.Mesh(geometryHingeA, materialHingeA); //Создаем объект сцены. | ||
+ | //Помещаем шарнир на сцену. | ||
scene.add(meshHingeA); | scene.add(meshHingeA); | ||
− | geometryHingeD = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); | + | //Создаем шарнир в точке D. |
− | materialHingeD = new THREE.MeshBasicMaterial(colorHingeD); | + | geometryHingeD = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); //Создаем фигуру (сфера). |
− | meshHingeD = new THREE.Mesh(geometryHingeD, materialHingeD); | + | materialHingeD = new THREE.MeshBasicMaterial(colorHingeD); //Создаем материал. |
+ | meshHingeD = new THREE.Mesh(geometryHingeD, materialHingeD); //Создаем объект сцены. | ||
+ | //Задаем положение центра шарнира. | ||
meshHingeD.position.x = -LENGTH_AB * Math.cos(Math.PI / 4); | meshHingeD.position.x = -LENGTH_AB * Math.cos(Math.PI / 4); | ||
meshHingeD.position.z = LENGTH_AB * Math.sin(Math.PI / 4); | meshHingeD.position.z = LENGTH_AB * Math.sin(Math.PI / 4); | ||
+ | //Помещаем шарнир на сцену. | ||
scene.add(meshHingeD); | scene.add(meshHingeD); | ||
− | geometryHingeE = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); | + | //Создаем шарнир в точке E. |
− | materialHingeE = new THREE.MeshBasicMaterial(colorHingeE); | + | geometryHingeE = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); //Создаем фигуру (сфера). |
− | meshHingeE = new THREE.Mesh(geometryHingeE, materialHingeE); | + | materialHingeE = new THREE.MeshBasicMaterial(colorHingeE); //Создаем материал. |
+ | meshHingeE = new THREE.Mesh(geometryHingeE, materialHingeE); //Создаем объект сцены. | ||
+ | //Задаем положение центра шарнира. | ||
meshHingeE.position.x = -LENGTH_AB * Math.cos(Math.PI / 4); | meshHingeE.position.x = -LENGTH_AB * Math.cos(Math.PI / 4); | ||
meshHingeE.position.z = -LENGTH_AB * Math.sin(Math.PI / 4); | meshHingeE.position.z = -LENGTH_AB * Math.sin(Math.PI / 4); | ||
+ | //Помещаем шарнир на сцену. | ||
scene.add(meshHingeE); | scene.add(meshHingeE); | ||
− | renderer.render(scene, camera); | + | renderer.render(scene, camera); //Рендинг сцены. |
} | } | ||
+ | //Функция добавления динамичных элементов крана на сцену. | ||
function drawDynamicCraneElements() { | function drawDynamicCraneElements() { | ||
− | var ALPHA = panelControlOptions.alpha / 180 * Math.PI; | + | var ALPHA = panelControlOptions.alpha / 180 * Math.PI; //Получаем текущие значение угла альфа. |
− | var WEIGHT_P = panelControlOptions.weightP; | + | var WEIGHT_P = panelControlOptions.weightP; //Получаем текущий вес груза. |
+ | //Вычисляем усилия стоек. | ||
panelInfoEffort.Sbd = WEIGHT_P * (Math.cos(ALPHA) - Math.sin(ALPHA)); | panelInfoEffort.Sbd = WEIGHT_P * (Math.cos(ALPHA) - Math.sin(ALPHA)); | ||
panelInfoEffort.Sbe = WEIGHT_P * (Math.cos(ALPHA) + Math.sin(ALPHA)); | panelInfoEffort.Sbe = WEIGHT_P * (Math.cos(ALPHA) + Math.sin(ALPHA)); | ||
panelInfoEffort.Sab = -WEIGHT_P * Math.sqrt(2) * Math.cos(ALPHA); | panelInfoEffort.Sab = -WEIGHT_P * Math.sqrt(2) * Math.cos(ALPHA); | ||
− | geometryRackAC = new THREE.CylinderGeometry(RADIUS_RACK, RADIUS_RACK, Math.sqrt(2) * LENGTH_AB, 32); | + | //Создаем стойку AC. |
− | materialRackAC = new THREE.MeshBasicMaterial(colorRackAC); | + | geometryRackAC = new THREE.CylinderGeometry(RADIUS_RACK, RADIUS_RACK, Math.sqrt(2) * LENGTH_AB, 32); //Создаем фигуру (цилиндр). |
− | meshRackAC = new THREE.Mesh(geometryRackAC, materialRackAC); | + | materialRackAC = new THREE.MeshBasicMaterial(colorRackAC); //Создаем материал. |
+ | meshRackAC = new THREE.Mesh(geometryRackAC, materialRackAC); //Создаем объект сцены. | ||
+ | //Задаем положение центра стойки. | ||
meshRackAC.position.x = Math.cos(ALPHA) * (LENGTH_AB / 2); | meshRackAC.position.x = Math.cos(ALPHA) * (LENGTH_AB / 2); | ||
meshRackAC.position.y = LENGTH_AB / 2; | meshRackAC.position.y = LENGTH_AB / 2; | ||
meshRackAC.position.z = -Math.sin(ALPHA) * (LENGTH_AB / 2); | meshRackAC.position.z = -Math.sin(ALPHA) * (LENGTH_AB / 2); | ||
+ | //Задаем углы поворота стойки. | ||
meshRackAC.rotation.y = ALPHA; | meshRackAC.rotation.y = ALPHA; | ||
meshRackAC.rotation.z = -Math.PI / 4; | meshRackAC.rotation.z = -Math.PI / 4; | ||
+ | //Помещаем стойку на сцену. | ||
scene.add(meshRackAC); | scene.add(meshRackAC); | ||
− | geometryCableBCP = new THREE.Geometry(); | + | //Создаем тросс через точку B, C и P. |
+ | geometryCableBCP = new THREE.Geometry(); //Создаем пустую геом. фигура. | ||
+ | //Добавляем в фигуру 3 точки. | ||
geometryCableBCP.vertices.push( | geometryCableBCP.vertices.push( | ||
− | new THREE.Vector3(0, LENGTH_AB + RADIUS_RACK, 0), | + | new THREE.Vector3(0, LENGTH_AB + RADIUS_RACK, 0), //Точка B. |
− | new THREE.Vector3(Math.cos(ALPHA) * (LENGTH_AB + RADIUS_RACK), LENGTH_AB + RADIUS_RACK, -Math.sin(ALPHA) * (LENGTH_AB + RADIUS_RACK)), | + | new THREE.Vector3(Math.cos(ALPHA) * (LENGTH_AB + RADIUS_RACK), LENGTH_AB + RADIUS_RACK, -Math.sin(ALPHA) * (LENGTH_AB + RADIUS_RACK)), //Точка C. |
− | new THREE.Vector3(Math.cos(ALPHA) * (LENGTH_AB + RADIUS_RACK), LENGTH_AB / 2, -Math.sin(ALPHA) * (LENGTH_AB + RADIUS_RACK))); | + | new THREE.Vector3(Math.cos(ALPHA) * (LENGTH_AB + RADIUS_RACK), LENGTH_AB / 2, -Math.sin(ALPHA) * (LENGTH_AB + RADIUS_RACK))); //Точка P. |
− | materialCableBCP = new THREE.LineBasicMaterial(colorCableBCP); | + | materialCableBCP = new THREE.LineBasicMaterial(colorCableBCP); //Создаем материал. |
− | meshCableBCP = new THREE.Line(geometryCableBCP, materialCableBCP); | + | meshCableBCP = new THREE.Line(geometryCableBCP, materialCableBCP); //Создаем объект сцены. |
− | scene.add(meshCableBCP); | + | scene.add(meshCableBCP); //Помещаем кабель на сцену. |
− | geometryEndRackAC = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); | + | //Создаем наконечник стойки AC. |
− | materialEndRackAC = new THREE.MeshBasicMaterial(colorEndRackAC); | + | geometryEndRackAC = new THREE.SphereGeometry(RADIUS_RACK, 32, 32); //Создаем фигуру (сфера). |
− | meshEndRackAC = new THREE.Mesh(geometryEndRackAC, materialEndRackAC); | + | materialEndRackAC = new THREE.MeshBasicMaterial(colorEndRackAC); //Создаем материал. |
+ | meshEndRackAC = new THREE.Mesh(geometryEndRackAC, materialEndRackAC); //Создаем объект сцены. | ||
+ | //Задаем положение центра наконечника. | ||
meshEndRackAC.position.x = Math.cos(ALPHA) * LENGTH_AB; | meshEndRackAC.position.x = Math.cos(ALPHA) * LENGTH_AB; | ||
meshEndRackAC.position.y = LENGTH_AB; | meshEndRackAC.position.y = LENGTH_AB; | ||
meshEndRackAC.position.z = -Math.sin(ALPHA) * LENGTH_AB; | meshEndRackAC.position.z = -Math.sin(ALPHA) * LENGTH_AB; | ||
− | scene.add(meshEndRackAC); | + | scene.add(meshEndRackAC); //Помещаем наконечник на сцену. |
− | geometryCargoP = new THREE.BoxGeometry(4, 2, 4); | + | //Создаем груз. |
− | materialCargoP = new THREE.MeshBasicMaterial(colorCargoP); | + | geometryCargoP = new THREE.BoxGeometry(4, 2, 4); //Создаем фигуру (параллелипипед.). |
− | meshCargoP = new THREE.Mesh(geometryCargoP, materialCargoP); | + | materialCargoP = new THREE.MeshBasicMaterial(colorCargoP); //Создаем материал. |
+ | meshCargoP = new THREE.Mesh(geometryCargoP, materialCargoP); //Создаем объект сцены. | ||
+ | //Задаем положение центра груза. | ||
meshCargoP.position.x = Math.cos(ALPHA) * (LENGTH_AB + RADIUS_RACK); | meshCargoP.position.x = Math.cos(ALPHA) * (LENGTH_AB + RADIUS_RACK); | ||
meshCargoP.position.y = LENGTH_AB / 2; | meshCargoP.position.y = LENGTH_AB / 2; | ||
meshCargoP.position.z = -Math.sin(ALPHA) * (LENGTH_AB + RADIUS_RACK); | meshCargoP.position.z = -Math.sin(ALPHA) * (LENGTH_AB + RADIUS_RACK); | ||
− | scene.add(meshCargoP); | + | scene.add(meshCargoP); //Помещаем груз на сцену. |
+ | //Если вектора усилий нужно отображать. | ||
if(panelControlOptions.visibleEffort == true) { | if(panelControlOptions.visibleEffort == true) { | ||
− | var tmp = -WEIGHT_P * Math.sqrt(2) * Math.cos(ALPHA); | + | var tmp = -WEIGHT_P * Math.sqrt(2) * Math.cos(ALPHA); //Усилие на стойку AB. |
+ | //Создаем вектор усилия стойки AB. | ||
vectorEffortAB = new THREE.ArrowHelper( | vectorEffortAB = new THREE.ArrowHelper( | ||
− | new THREE.Vector3(0, (tmp < 0) ? -1 : 0, 0), | + | new THREE.Vector3(0, (tmp < 0) ? -1 : 0, 0), //Направление. |
− | new THREE.Vector3(0, (tmp < 0) ? (-LENGTH_AB / 2) : (LENGTH_AB / 2), 0), | + | new THREE.Vector3(0, (tmp < 0) ? (-LENGTH_AB / 2) : (LENGTH_AB / 2), 0), //Координата начала (относительно центра стойки). |
− | Math.abs(tmp), | + | Math.abs(tmp), //Длина. |
− | colorEffortAB | + | colorEffortAB //Цвет. |
); | ); | ||
− | meshRackAB.add(vectorEffortAB); | + | meshRackAB.add(vectorEffortAB); //Добавляем вектор усилия к стойке AB. |
− | var tmp = WEIGHT_P * (Math.cos(ALPHA) - Math.sin(ALPHA)); | + | |
+ | var tmp = WEIGHT_P * (Math.cos(ALPHA) - Math.sin(ALPHA)); //Усилие на стойку BD. | ||
+ | //Создаем вектор усилия стойки BD. | ||
vectorEffortBD = new THREE.ArrowHelper( | vectorEffortBD = new THREE.ArrowHelper( | ||
− | new THREE.Vector3(0, (tmp < 0) ? -1 : 1, 0), | + | new THREE.Vector3(0, (tmp < 0) ? -1 : 1, 0), //Направление. |
− | new THREE.Vector3(0, (tmp < 0) ? -(Math.sqrt(2) * LENGTH_AB / 2) : (Math.sqrt(2) * LENGTH_AB / 2), 0), | + | new THREE.Vector3(0, (tmp < 0) ? -(Math.sqrt(2) * LENGTH_AB / 2) : (Math.sqrt(2) * LENGTH_AB / 2), 0), //Координата начала (относительно центра стойки). |
− | Math.abs(tmp), | + | Math.abs(tmp), //Длина. |
− | colorEffortBD | + | colorEffortBD //Цвет. |
); | ); | ||
− | meshRackBD.add(vectorEffortBD); | + | meshRackBD.add(vectorEffortBD); //Добавляем вектор усилия к стойке BD. |
− | var tmp = WEIGHT_P * (Math.cos(ALPHA) + Math.sin(ALPHA)); | + | var tmp = WEIGHT_P * (Math.cos(ALPHA) + Math.sin(ALPHA)); //Усилие на стойку BE. |
+ | //Создаем вектор усилия стойки BE. | ||
vectorEffortBE = new THREE.ArrowHelper( | vectorEffortBE = new THREE.ArrowHelper( | ||
− | new THREE.Vector3(0, (tmp < 0) ? -1 : 1, 0), | + | new THREE.Vector3(0, (tmp < 0) ? -1 : 1, 0), //Направление. |
− | new THREE.Vector3(0, (tmp < 0) ? -(Math.sqrt(2) * LENGTH_AB / 2) : (Math.sqrt(2) * LENGTH_AB / 2), 0), | + | new THREE.Vector3(0, (tmp < 0) ? -(Math.sqrt(2) * LENGTH_AB / 2) : (Math.sqrt(2) * LENGTH_AB / 2), 0), //Координата начала (относительно центра стойки). |
− | Math.abs(tmp), | + | Math.abs(tmp), //Длина. |
− | colorEffortBE | + | colorEffortBE //Цвет. |
); | ); | ||
− | meshRackBE.add(vectorEffortBE); | + | meshRackBE.add(vectorEffortBE); //Добавляем вектор усилия к стойке BE. |
} else { | } else { | ||
vectorEffortAB = null; | vectorEffortAB = null; | ||
Строка 307: | Строка 356: | ||
} | } | ||
− | renderer.render(scene, camera); | + | renderer.render(scene, camera); //Рендинг сцены. |
} | } | ||
+ | //Функция перерисовки элементов крана на сцене. | ||
function redrawCraneElements() { | function redrawCraneElements() { | ||
− | scene.remove(meshRackAC); | + | //Удаляем динамические элементы со сцены. |
− | scene.remove(meshCableBCP); | + | scene.remove(meshRackAC); //Удаление стойки AC. |
− | scene.remove(meshEndRackAC); | + | scene.remove(meshCableBCP); //Удаление троса. |
− | scene.remove(meshCargoP); | + | scene.remove(meshEndRackAC); //Удаление наконечника стойки AC. |
− | if (vectorEffortAB != null) meshRackAB.remove(vectorEffortAB); | + | scene.remove(meshCargoP); //Удаление груза. |
− | if (vectorEffortBD != null) meshRackBD.remove(vectorEffortBD); | + | if (vectorEffortAB != null) meshRackAB.remove(vectorEffortAB); //Удалили вектор усилия со стойки AB. |
− | if (vectorEffortBE != null) meshRackBE.remove(vectorEffortBE); | + | if (vectorEffortBD != null) meshRackBD.remove(vectorEffortBD); //Удалили вектор усилия со стойки BD. |
+ | if (vectorEffortBE != null) meshRackBE.remove(vectorEffortBE); //Удалили вектор усилия со стойки BE. | ||
+ | //Добавляем динамические элементы на сцену. | ||
drawDynamicCraneElements(); | drawDynamicCraneElements(); | ||
} | } | ||
− | + | //Функция рендеринга, вызывается браузером через равные интервалы времени, для | |
+ | //перерисовки сцены. | ||
function render() { | function render() { | ||
statFPS.update(); | statFPS.update(); | ||
− | requestAnimationFrame(render); | + | requestAnimationFrame(render); //Вызвать эту же функцию для рендинга в следующий момент времени (момент времени зависит от браузера). |
− | renderer.render(scene, camera); | + | renderer.render(scene, camera); //Рендинг сцены. |
} | } | ||
+ | //Функция, которая вызывается, когда был изменен размер окна. | ||
function changeSizeWindow() { | function changeSizeWindow() { | ||
camera.aspect=window.innerWidth/window.innerHeight; | camera.aspect=window.innerWidth/window.innerHeight; | ||
Строка 338: | Строка 392: | ||
} | } | ||
+ | //Функция, которая создает объект: для отображения FPS. | ||
function initStatFPS() | function initStatFPS() | ||
{ | { | ||
var stats=new Stats(); | var stats=new Stats(); | ||
stats.setMode(0); | stats.setMode(0); | ||
+ | |||
stats.domElement.style.position='0px'; | stats.domElement.style.position='0px'; | ||
stats.domElement.style.left='0px'; | stats.domElement.style.left='0px'; | ||
stats.domElement.style.top='0px'; | stats.domElement.style.top='0px'; | ||
+ | |||
document.getElementById("Stats-output").appendChild(stats.domElement); | document.getElementById("Stats-output").appendChild(stats.domElement); | ||
return stats; | return stats; |