Я пытаюсь создать кубик из 5 кубоидов один из другого, который вращается на 180 градусов по часовой стрелке каждые две секунды.логика анимации 3d.js для вращающихся кубоидов
Это своего рода работа, но я не получаю гладких результатов ... Я думал, что хорошая стратегия будет заключаться в том, что в течение вращающегося периода - z-позиция верхних и верхних правых вершин одного лица будет Если они совпадают, то пришло время остановить вращающийся период.
Проблема в том, что разница между вершинами никогда не равна нулю. Она очень близка к нулю ... поэтому я проверяю, находится ли она в поле 0,1 и, следовательно, у меня есть проблема с началом вращения, которое застрял, потому что иногда это меньше 0,1. Также иногда вращение продолжается, когда они должны останавливаться, потому что разница не меньше 0,1.
var spinningPeriod = false, counter = 0, lastTime = 0;
function animate(){
counter++;
var time = (new Date()).getTime();
var timeDiff = time - lastTime;
var angleChange = 0.2 * timeDiff * 2 * Math.PI/1000;
if (counter%200==0 && counter > 0) {
spinningPeriod = true;
}
if (spinningPeriod) {
var v1 = cubes[0].geometry.vertices[0].clone();
var v2 = cubes[0].geometry.vertices[3].clone();
cubes[0].updateMatrixWorld();
cubes[0].localToWorld(v1);
cubes[0].localToWorld(v2);
if (Math.abs(v1.x - v2.x) < 0.1) {
spinningPeriod = false;
}
for (var ii =0; ii<5; ++ii) {
cubes[ii].rotation.y += angleChange;
}
}
lastTime = time;
renderer.render(scene, camera);
// request new frame
requestAnimationFrame(function(){
animate();
});
}
// renderer
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// camera
var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 1000);
camera.position.z = 500;
// scene
var scene = new THREE.Scene();
// cube
var cubes = new Array();
var currentHeight = -150;
for (var ii =0; ii<5; ++ii) {
cubes[ii] = new THREE.Mesh(new THREE.CubeGeometry(400, 50, 20));
currentHeight += 50;
cubes[ii].position.y = currentHeight;
cubes[ii].overdraw = true;
scene.add(cubes[ii]);
}
// start animation
animate();