Мне нужно сделать несколько 3d-кубов, выполненных в html и css, перетаскиваемых по странице, и иметь возможность вращать их одновременно. Мне удалось сделать их перетаскиваемыми, но как мне теперь добавить вращение?
Я нашел несколько интересных скриптов codepen по вращению с событиями мыши (например, https://codepen.io/jordizle/pen/haIdo/),, но я не могу понять, как перетаскивать их и поворачивать в 3d с одинаковыми событиями (mousedown, mousemove) , mouseup). Также я стараюсь не использовать three.js, потому что я новичок в этом, и мои кубы уже сделаны в html / css.
Вот пример того, где я сейчас нахожусь:
https://jsfiddle.net/5j7t3rde/1/?fbclid=IwAR3AAnPdBXKOQSM0z7Ou5xocyw1fM53d-aAHEvWrS7p92HxcRqIf11ykP4w
А вот javascript, который делает мои кубы перетаскиваемыми
var container = document.querySelector("#container_cubes");
var activeItem = null;
var active = false;
container.addEventListener("touchstart", dragStart, false);
container.addEventListener("touchend", dragEnd, false);
container.addEventListener("touchmove", drag, false);
container.addEventListener("mousedown", dragStart, false);
container.addEventListener("mouseup", dragEnd, false);
container.addEventListener("mousemove", drag, false);
function dragStart(e) {
"use strict";
if (e.target !== e.currentTarget) {
active = true;
// this is the item we are interacting with
activeItem = e.target;
if (activeItem !== null) {
if (!activeItem.xOffset) {
activeItem.xOffset = 0;
}
if (!activeItem.yOffset) {
activeItem.yOffset = 0;
}
if (e.type === "touchstart") {
activeItem.initialX = e.touches[0].clientX - activeItem.xOffset;
activeItem.initialY = e.touches[0].clientY - activeItem.yOffset;
} else {
console.log("doing something!");
activeItem.initialX = e.clientX - activeItem.xOffset;
activeItem.initialY = e.clientY - activeItem.yOffset;
}
}
}
}
function dragEnd(e) {
"use strict";
if (activeItem !== null) {
activeItem.initialX = activeItem.currentX;
activeItem.initialY = activeItem.currentY;
}
active = false;
activeItem = null;
}
function drag(e) {
"use strict";
if (active) {
if (e.type === "touchmove") {
e.preventDefault();
activeItem.currentX = e.touches[0].clientX - activeItem.initialX*0.3;
activeItem.currentY = e.touches[0].clientY - activeItem.initialY*0.3;
} else {
activeItem.currentX = e.clientX - activeItem.initialX;
activeItem.currentY = e.clientY - activeItem.initialY;
}
activeItem.xOffset = activeItem.currentX;
activeItem.yOffset = activeItem.currentY;
setTranslate(activeItem.currentX, activeItem.currentY, activeItem);
}
}
function setTranslate(xPos, yPos, el) {
"use strict";
el.style.transform = "translate3d(" + xPos + "px, " + yPos + "px, 0)";
}
Надеюсь, это имеет смысл, спасибо за ваши ответы!