1

OpenGlオブジェクトをらせん状のパターンで変換しようとしています。私はこれを理解することはできません。問題は、x、y、z座標の角度をインクリメントする必要があることはわかっていますが、使用する移動関数は、オブジェクトに固有の移動量だけオブジェクトを移動します。私が使用している軸は、Yが上、Zが画面、Xが右です。

public override void Move(Figure fig)
{
   double angle = 0;
   double x = RADIUS * Math.Cos(angle);
   double y = (angle / RADIUS);
   double z = RADIUS * Math.Sin(angle);
   fig.Translate(x, y, z);
   angle += .5;
}
public void Translate(double fx, double fy, double fz)
{
   translateAmt[0] += fx;
   translateAmt[1] += fy;
   translateAmt[2] += fz;

}
4

3 に答える 3

2

これにアプローチするには、次の 2 つの方法があります。

手続き的に

NeHe レッスン 36ProcessHelixで関数を確認してください。少し読みにくいですが、らせんに沿ってポイントを取得するために使用される基本的なループと計算を確認できるはずです。

2 平行移動と回転

これらの変換を適切な順序で実行すると、らせん運動を得ることができます。これは、頭の中で想像する順序です。

  1. オブジェクトを原点から遠ざける (例: +x) らせんの半径
  2. 原点 (y 軸) を中心にオブジェクトを回転させ、円運動を作成します。
  3. オブジェクトを y 軸に沿って移動し、らせん運動を作成します。

そのため、OpenGL では、指定された最後の行列が最初に適用される行列であるため、それらを逆方向に実行します... +y に変換し (時間依存)、y を中心に回転させ (時間依存)、x に変換します。

于 2009-10-18T03:31:08.580 に答える
1

うまくいきました!

  private const double RADIUS = 1;
  private const double INTERVAL = 0.1;
  private double theta = 5;
  private double alpha = 0;
  private const double ANGLE = 10;

public override void Move(Figure fig)
  {
     double x = RADIUS * Math.Cos(theta);
     double y = 0;
     double z = RADIUS * Math.Sin(theta);
     double deltaX = z * Math.Cos(alpha) - x * Math.Sin(alpha);
     double deltaZ = x * Math.Cos(alpha) + z * Math.Sin(alpha);
     fig.Translate(deltaX, y, deltaZ);
     fig.Rotate(ANGLE, 0, 0, 1);
     alpha += INTERVAL;
  }
于 2009-10-20T02:03:38.460 に答える
0

コードが不足していると思います。

Move では、角度は常に 0 から始まるため、x、y、z の値は常に同じになります。次に Move を実行すると、再び 0 になります。

この値が変化し続けるように、Move に角度を渡す必要があります。

関数内で更新して実際に更新できるようにするには、ポインターとして渡す必要がある場合があります。または、Move が double と を返すようにする必要がありreturn angle;ます。

角度を 0.5 ずつ変更するのは正しくないと思います。繰り返し数 * 値に基づく必要があるかもしれませんが、最初の問題を最初に修正することをお勧めします。

于 2009-10-18T03:10:12.127 に答える