Облегчить вращение к мышке - PullRequest
3 голосов
/ 18 апреля 2011

Следующий код поворачивает линию в направлении положения мыши, используя простую функцию замедления, но проблема в том, что методы atan2 () работают от -PI до PI, заставляя линию поворачиваться назад, когда угол достигает одного из пределовЯ могу сделать так, чтобы он вращался от 0 до TWO_PI, но нет никакой разницы, так как линия будет вращаться в обратном направлении, пока не достигнет targetAngle, если я не использую вычисление замедления работает нормально, потому что переход от -PI к PI незаметен, так какя могу облегчить вращение и избежать этой проблемы?

float angle = 0;
float targetAngle = 0;
float easing = 0.1;

void setup() {
  size(320, 240);
}

void draw() {
  background(200);
  noFill();
  stroke( 0 );

  // get the angle from the center to the mouse position
  angle = atan2( mouseY - height/2, mouseX - width/2 );
  // check and adjust angle to go from 0 to TWO_PI
  if ( angle < 0 ) angle = TWO_PI + angle;

  // ease rotation
  targetAngle += (angle - targetAngle) * easing;

  pushMatrix();
  translate( width/2, height/2 );
  rotate( targetAngle );
  line( 0, 0, 60, 0 );
  popMatrix();
}

Спасибо

1 Ответ

6 голосов
/ 18 апреля 2011

Не уверен, правильно ли я понял проблему ... Вы имеете в виду, что если положение мыши немного меньше + PI, а targetAngle немного больше, чем -PI, то линия поворачивается от мыши?Дело в том, что даже если оба значения находятся в одном диапазоне (-PI, PI), они все равно могут быть довольно далеко друг от друга.Вы должны настроить angle, чтобы соответствовать PI-окрестности текущего значения targetAngle.

// get the angle from the center to the mouse position
angle = atan2( mouseY - height/2, mouseX - width/2 );
// check and adjust angle to be closer to targetAngle
if ( angle < targetAngle - PI ) angle = angle + TWO_PI;
if ( angle > targetAngle + PI ) angle = angle - TWO_PI;

Это будет работать, если targetAngle находится в диапазоне (-TWO_PI, TWO_PI).Кажется, это будет работать для вас.Если targetAngle может иметь какое-либо значение очень далеко от рабочего диапазона, то вы можете использовать что-то вроде этого:

// get the angle from the center to the mouse position
angle = atan2( mouseY - height/2, mouseX - width/2 );
// calculate the shortest rotation direction
float dir = (angle - targetAngle) / TWO_PI;
dir = dir - Math.round(dir);
dir = dir * TWO_PI;

// ease rotation
targetAngle += dir * easing;
...