// // // // ОтслеживатьНажатияВРисователе = мир => { мир.отслеживатьНажатияВРисователе = true; уведомитьОНажатии = (событие) => { if (!мир.отслеживатьНажатияВРисователе) { return; } var позиция = new THREE.Vector2(); var ширина = мир.ширинаОкна; var высота = мир.высотаОкна; позиция.x = ((событие.clientX + window.pageXOffset) / ширина ) * 2 - 1; позиция.y = - ((событие.clientY + window.pageYOffset) / высота) * 2 + 1; мир.позицияНажатияВРисователе = позиция; мир.уведомить("нажатие в рисователе"); }; // Палец. window.addEventListener( "touchstart", function(событие) { уведомитьОНажатии(событие.touches[0]); } ); // Мышь. window.addEventListener( "click", function(событие) { уведомитьОНажатии(событие); } ); // iOS. // https://stackoverflow.com/a/31459240/3404710 мир.рисователь.domElement.style.cursor = "pointer"; }; // // // // ЗапуститьРисователя = мир => { function отрисовать(время) { requestAnimationFrame(отрисовать); мир.рисователь.render(мир.сцена, мир.камера); мир.времяРисования = время; мир.уведомить("отрисовали кадр"); } отрисовать(); }; // // // // ПрименитьРазмерРисователя = мир => { мир.камера.aspect = мир.ширинаОкна / мир.высотаОкна; мир.камера.updateProjectionMatrix(); var чёткостьApple = 2; мир.рисователь.setSize(мир.ширинаОкна * чёткостьApple, мир.высотаОкна * чёткостьApple); мир.канва.style = ` position: absolute; left: 0; top: 0; width: ${мир.ширинаОкнаПроц}%; max-width: ${мир.ширинаОкнаПроц}%; height: ${мир.высотаОкнаПроц}%; max-height: ${мир.высотаОкнаПроц}%; `; }; // // // // ИзменитьРазмерРисователя = мир => { мир.ширинаОкна = window.innerWidth * мир.масштаб; мир.высотаОкна = window.innerHeight * мир.масштаб; мир.ширинаОкнаПроц = мир.масштаб * 100; мир.высотаОкнаПроц = мир.масштаб * 100; }; // // // // ОтслеживатьИзменениеРазмераОкнаБраузера = мир => { window.addEventListener( "resize", function() { мир.уведомить("изменили размер окна браузера"); } ); }; // // // // НастроитьРисователя = мир => { мир.сцена = new THREE.Scene(); мир.камера = new THREE.PerspectiveCamera(45, 1, 0.1, 1000); мир.ловец = new THREE.Raycaster(); мир.модельер = new THREE.GLTFLoader(); мир.текстурщик = new THREE.TextureLoader(); мир.масштаб = 1; мир.канва = document.createElement("canvas"); document.body.prepend(мир.канва); мир.рисователь = new THREE.WebGLRenderer({canvas: мир.канва, antialias: true}); }; // // // // УстановитьBase64JS = мир => { var модуль = мир.модули.модульПоУказателю(УКАЗАТЕЛЬ_ЭТОГО_МОДУЛЯ); var содержимое = модуль.содержимое["/base64js.min.js"]; eval(содержимое); мир.база64ИзДвоичногоМассива = base64js.fromByteArray; мир.база64ВДвоичныйМассив = base64js.toByteArray; }; // // // // УстановитьThreeJS = мир => { var модуль = мир.модули.модульПоУказателю(УКАЗАТЕЛЬ_ЭТОГО_МОДУЛЯ); var код = модуль.содержимое["/three.js"]; var скрипт = document.createElement("script"); скрипт.innerHTML = код; document.body.appendChild(скрипт); };