Мещерский 48.6 — различия между версиями
(Новая страница: «ещерский Задача 48.6 Визуализация 3D-задачи по динамике на JavaScript Исполнитель: Елизаров Ми…») |
(→Визуализация) |
||
Строка 25: | Строка 25: | ||
==Визуализация== | ==Визуализация== | ||
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Elizarov_MA/ | + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Elizarov_MA/kursach.html |width=850 |height=400 |border=0 }} |
==Код программы== | ==Код программы== |
Версия 11:10, 22 декабря 2017
ещерский Задача 48.6
Визуализация 3D-задачи по динамике на JavaScript
Исполнитель: Елизаров Михаил
Группа 23632/2 Кафедра Теоретической механики
Содержание
Условие задачи
В эпициклическом механизме бегающая шестеренка радиуса r_1 насажена на кривошип с противовесом, вращающийся вокруг оси неподвижной шестеренки под действием приложенного момента M. Определить угловое ускорение вращения кривошипа и окружное усилие S в точке касания шестеренок, если расстояние между осями шестеренок равно l, момент инерции кривошипа с противовесом относительно оси вращения кривошипа равен J_0, масса бегающей шестеренки m_1, момент инерции шестеренки относительно ее оси J_1; трением пренебречь, центр масс шестеренки и кривошипа с противовесом находится на оси вращения кривошипа.
Решение
Для блока А:
Для блока В:
Для груза С:
Визуализация
Код программы
1 var stats = initStats();
2 var scene = new THREE.Scene();
3 var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
4 var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
5 var webGLRenderer = new THREE.WebGLRenderer();
6 webGLRenderer.setClearColor(new THREE.Color(0xEEEEEE));
7 webGLRenderer.setSize(window.innerWidth, window.innerHeight);
8 webGLRenderer.shadowMapEnabled = true;
9 camera.position.x = 65;
10 camera.position.y = 65;
11 camera.position.z = 65;
12 camera.lookAt(new THREE.Vector3(0, 0, 0));
13 var planeGeometry = new THREE.PlaneBufferGeometry(100,100);
14 var planeMaterial = new THREE.MeshBasicMaterial({color:0x555555});
15 var plane = new THREE.Mesh(planeGeometry, planeMaterial);
16 plane.rotation.x = -0.5 * Math.PI;
17 plane.position.x = 0;
18 plane.position.y = 0;
19 plane.position.z = 0;
20 var plane2 = new THREE.Mesh(planeGeometry, planeMaterial);
21 plane2.rotation.x = -1.5*Math.PI;
22 plane2.position.x = 0;
23 plane2.position.y = 0;
24 plane2.position.z = 0;
25 height0 =5;
26 r20=3
27 l10 = 10;
28 var cyl2Material = new THREE.MeshNormalMaterial();
29 var cyl2;
30 var cyl1;
31 var phase2 = 0;
32 var S = 5;
33 var vectMaterial = new THREE.MeshBasicMaterial({color: 0x00ff00});
34 var cylMat1 = new THREE.MeshBasicMaterial({color: 0xff0000});
35 var cylMat2 = new THREE.MeshBasicMaterial({color: 0x0000ff});
36 var crankMaterial = new THREE.MeshNormalMaterial();
37 var crank;
38 var phase1 = 0;
39 var eps = 0;
40 var group;
41 var controls = new function () {
42 this.height =5;
43 this.r2=3
44 this.l1 = 10;
45 this.m1 = 5;
46 this.Time = 5;
47 this.M = 0.1;
48 this.J0 = 1;
49 this.J1 = 1;
50
51
52
53 this.cyl2posX = 10;
54 this.cyl2posY = height0/2;
55 this.cyl2posZ = 0;
56
57 this.crankposX = 5;
58 this.crankposZ = 0;
59 this.crankposY= height0+0.5
60 this.crankRotZ = 0.5*Math.PI;
61 this.redraw = function () {
62 scene.remove(group);
63 scene.remove(cyl1);
64
65 cyl2 = new THREE.Mesh(new THREE.CylinderGeometry(controls.r2, controls.r2, controls.height, 100, 100, false,Math.PI,Math.PI),cylMat1);
66 cyl2_ = new THREE.Mesh(new THREE.CylinderGeometry(controls.r2, controls.r2, controls.height, 100, 100, false,0,Math.PI),cylMat2);
67 vect = new THREE.Mesh(new THREE.CylinderGeometry(0.03,0.03, S,20,20,false), vectMaterial);
68 vectarrow = new THREE.Mesh(new THREE.CylinderGeometry(0,0.12, 2,20,20,false), vectMaterial);
69 crank = new THREE.Mesh( new THREE.CylinderGeometry(0.5,0.5,controls.l1,50,50, false), new THREE.MeshNormalMaterial() );
70 r1 = controls.l1-controls.r2;
71 cyl1 = new THREE.Mesh(new THREE.CylinderGeometry(r1,r1, controls.height,100,100,false),new THREE.MeshNormalMaterial());
72
73
74 cyl2.position.set(controls.l1,controls.cyl2posY,controls.cyl2posZ);
75 cyl2_.position.set(controls.l1,controls.cyl2posY,controls.cyl2posZ);
76 cyl2_.rotation.set(0,phase2,0);
77 cyl2.rotation.set(0,phase2,0);
78 crank.position.set(controls.l1*0.5,controls.crankposY,controls.crankposZ);
79 crank.rotation.set(0,0,controls.crankRotZ);
80 cyl1.position.y = controls.height/2;
81 vect.position.set(r1,controls.height/2,S/2);
82 vectarrow.position.set(r1,controls.height/2,S/2+2);
83 vect.rotation.set(0.5*Math.PI,0,0);
84 vectarrow.rotation.set(0.5*Math.PI,0,0);
85
86 group = new THREE.Group();
87
88 group.position.x = 0;
89 group.position.y = 0;
90 group.position.z = 0;
91
92 group.add(cyl2_);
93 group.add(cyl2);
94 group.add(crank);
95 group.add(vect);
96 group.add(vectarrow);
97
98
99 group.rotation.y = phase1;
100
101 scene.add(group);
102 scene.add(cyl1);
103 }
104 }
105
106 scene.add(plane);
107 scene.add(plane2);
108
109 document.getElementById("WebGL-output").appendChild(webGLRenderer.domElement);
110
111 var gui = new dat.GUI();
112 gui.add(controls, 'r2', 3, controls.l1-0.05).onChange(controls.redraw);
113 gui.add(controls, 'l1', 10, 30).onChange(controls.redraw);
114 gui.add(controls, 'm1', 0.6, 10);
115 gui.add(controls,'Time', 0.1, 10);
116 gui.add(controls, 'M',0,180);
117 gui.add(controls, 'J0',0,250);
118 gui.add(controls, 'J1',0,250);
119 var step =0;
120
121
122 controls.redraw();
123 render();
124 orbit = new THREE.OrbitControls(camera, webGLRenderer.domElement);
125 orbit.enableDamping = true;
126 function render() {
127 stats.update();
128 step0 = Math.PI/(controls.Time * 60);
129 step += 2*step0;
130 //step =1/360;
131 sum = controls.J0+controls.m1*(controls.l1)^2 + (controls.J1*(controls.l1)^2)/(controls.r2)^2;
132 eps = (controls.M / sum);
133 S = (controls.J1*controls.l1*eps)/(controls.r1);
134 group.rotation.y += (step*eps);
135 cyl2.rotation.y += ((step*eps*controls.l1)/(controls.r2));
136 cyl2_.rotation.y +=((step*eps*controls.l1)/(controls.r2));
137
138 // controls.positionBoundingBox();
139 // render using requestAnimationFrame
140 requestAnimationFrame(render);
141
142 webGLRenderer.render(scene, camera);
143 phase1 = group.rotation.y;
144
145 phase2=cyl2.rotation.y;
146 }
147
148 function initStats() {
149
150 var stats = new Stats();
151 stats.setMode(0); // 0: fps, 1: ms
152
153 // Align top-left
154 stats.domElement.style.position = 'absolute';
155 stats.domElement.style.left = '0px';
156 stats.domElement.style.top = '0px';
157
158 document.getElementById("Stats-output").appendChild(stats.domElement);
159
160 return stats;
161 }
162 }