#javascript #three.js #rotation
#javascript #three.js #вращение
Вопрос:
Я хочу изменить / запустить анимированное вращение объекта при нажатии кнопки. Я понимаю, что функция рендеринга представляет собой бесконечный цикл, и этот cylinder.rotation.x = 0.1 увеличивает угол и заставляет объект вращаться. Я хочу изменить запуск этого параметра с помощью кнопки. До сих пор мне удалось добавить к повороту только один раз, пока нажата кнопка. Может быть, рабочий пример объяснит лучше:
<html>
<head>
<title>3D Cube</title>
<style>
canvas { width: 100%;
height: 100% }
</style>
</head>
<body>
<script src="three.js"></script>
<script>
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
var cylindergeometry = new THREE.CylinderGeometry(0.1, 0.1, 2, 50, false);
var cylindermaterial = new THREE.MeshLambertMaterial({wireframe: true, color: 0x000000});
var cylinder = new THREE.Mesh(cylindergeometry, cylindermaterial);
cylinder.position.set(0,0,0);
scene.add(cylinder);
camera.position.z = 5;
var render = function () {
requestAnimationFrame(render);
cylinder.rotation.x = 0.1;
renderer.render(scene, camera);
};
render();
var btn = document.createElement("BUTTON");
var t = document.createTextNode("CLICK ME");
btn.appendChild(t);
document.body.appendChild(btn);
btn.onclick=function(){
// start animation
// change cylinder.rotation.x = 0.1; to cylinder.rotation.x = 0.1;
};
</script>
</body>
</html>
Ответ №1:
Просто двигайтесь render()
внутрь onclick
.
var render = function () {
requestAnimationFrame(render);
cylinder.rotation.x = 0.1;
renderer.render(scene, camera);
};
btn.onclick = function() {
render();
};
Это работает для вашей конкретной проблемы, но, вероятно, не является хорошим решением, если вы хотите выполнить более сложную логику. Вместо этого вы могли бы разделить логику рендеринга и цилиндра на что-то вроде этого:
/* global render function */
var render = function() {
requestAnimationFrame(render);
renderer.render(scene, camera);
};
render();
/* cylinder rotation logic */
var rotateCylinder = function() {
requestAnimationFrame(rotateCylinder);
cylinder.rotation.x = 0.1;
};
/* start the rotation */
btn.onclick = function() {
rotateCylinder();
};
Это совершенно не укладывается у меня в голове и может иметь свои недостатки.
Ответ №2:
Сделайте это «0.1» значением внутри переменной и измените эту переменную внутри обратного вызова onclick. На самом деле, сделайте так, чтобы эта переменная начиналась с нуля. Затем вы увеличиваете значение до 0,1 внутри обратного вызова кнопки.
...
camera.position.z = 5;
var rotationAmount = 0.0; // initial value is zero so it starts not rotating.
var render = function () {
requestAnimationFrame(render);
// make 0.1 a variable and increment the rotation, by that variable, between every frame.
cylinder.rotation.x = rotationAmount; // starts without any rotation. even though " =" is there.
// without " =" your object won't rotate as frames change. it would stand still in a 0.1 angle, frame after frame.
renderer.render(scene, camera);
};
...
Ваш обратный вызов onclick. анимация начнется после первого нажатия на кнопку.
...
btn.onclick=function(){
// start animation
// change cylinder.rotation.x = 0.1; to cylinder.rotation.x = 0.1;
// changing variable inside onclick callback.
rotationAmount = 0.1 // every click on that button will make rotation faster. it started at zero, first click will put it to 0.1.
// or add any other logic you can imagine using this button.
if (rotationAtmount > 0.1)
rotationAtmount = 0 // 1 click starts, 1 click stops.
};
...