3

次のコードは、単純なイーズ関数を使用して線をマウスの位置に向かって回転させますが、問題は、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();
}

ありがとう

4

1 に答える 1

6

問題を正しく理解したかどうかわかりません...マウスの位置が+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;
于 2011-04-18T13:49:47.873 に答える