Вращение 3D модели. Проблема с рывками

428
04 февраля 2017, 10:39

Пытаюсь решить проблему с трансформацией и скачками во время передачи данных. https://jsfiddle.net/nevolgograd/v4ac3g7w/9/

Куб крутится при зажатом Alt + левая кнопка мыши. Движение происходит за счет трансформации поворотом на pageX и pageY мыши, относительно центра экрана. Все работает почти замечательно до тех пор, пока я не отпускаю одну из кнопок и не перемещаю мышь в другую точку. Координаты мыши меняются, данные передаются в transform: rotate и куб совершает этот безумный разворот. Как этого избежать? Проще говоря, каким образом задавать новый центр координат при каждом щелчке мыши?

$("body").mousedown(function(event) {
  if(event.which == 1 && event.altKey) { moving = true; } 
  if(moving) {
    $(document).mousemove(function(event){
      var width = document.documentElement.clientWidth,
          halfWidth = document.documentElement.clientWidth/2,
          eventX = event.pageX - halfWidth,
          height = document.documentElement.clientHeight,
          halfHeight = document.documentElement.clientHeight/2,
          eventY = event.pageY - halfHeight;
      $('#cube').css({
        'transform':'rotateX(' + -eventY +'deg) rotateY(' + eventX + 'deg)'
      })
    });
  }
});
$('body').mouseup(function(event){
  if(event.which == 1 || event.altKey == false) {
    moving = false;
    $(document).off("mousemove");
  }
});
Answer 1

Сохраните текущее положение мышки при нажатии:

$("body").mousedown(function(event) {
   if(event.which == 1 && event.altKey) { 
      moving = true; 
      $x= event.pageX;
      $y= event.pageY;

Затем при движении мыши добавьте разницу к текущим координатам:

$("body").mousemove(function(event){
   if(moving) {
      eventX += event.pageX - $x;
      eventY += event.pageY - $y;
      $x=event.pageX;
      $y=event.pageY;

Вот и вся магия.

И уберите альт из условия окончания вращения:

$('body').mouseup(function(event){
    if(event.which == 1) { 
        moving = false;

В идеале надо еще добавить отмену выделения мышкой, а то глючит из-за нее вращение:

#cube {
  -webkit-user-select: none;  /* Chrome all / Safari all */
  -moz-user-select: none;     /* Firefox all */
  -ms-user-select: none;      /* IE 10+ */
  user-select: none; 
}

Результат: https://jsfiddle.net/Ljcarqjd/1/

READ ALSO
Изменение ссылки при вставке данных из окна

Изменение ссылки при вставке данных из окна

ЗдравствуйтеВозникла необходимость реализовать изменение ссылки при вставке данных из окна Пример:

430
Клонирование объекта

Клонирование объекта

Вопрос в строке clone[key] = user[key]По идее user[key] содержит только значение(Вася и 30) свойств name и age, а в переменной key хранится имя свойства? Но в результате...

393
Проблема с кареткой в angular

Проблема с кареткой в angular

Добрый день! Есть директива, которая оборачивает input, добавляет к input некий атрибут и затем компилирует этот элемент

379