0

これはシンプルでわかりやすいと思いましたが、そうではありません。openGLアプリケーションにカメラがあり、表示された画像をそれぞれカメラの「場所」に変換しています。とによって位置が変更されUpますDownLeftと を使用してカメラを回転させることができますRight。カメラが回転すると、前方と後方の動きが異なるはずです。これは私が作ったものです:

  //Somewhere in event handler switch
  else if (key == GLUT_KEY_UP|| key == GLUT_KEY_DOWN) {
    char direction = key==GLUT_KEY_UP?1:-1;   //Whether it is forward or backward movement
    std::cout<<"Moving camera in direction "<<(int)direction<<" with angle "<<rotate_y<<'\n';
    std::cout<<" - this means X is multiplied by "<<((sin((rotate_y/180)*M_PI)+1)/2)<<'\n';
    camera_x += 0.5*((sin((rotate_y/180)*M_PI)+1)/2)*direction;
    camera_z += 0.5*((cos((rotate_y/180)*M_PI)+1)/2)*direction;
  }

元の回転は度単位ですが、sin()frommath.hはラジアンを受け入れます。結果に 1 を追加して、0 ~ 2 の結果を取得します。次に、結果を 2 で除算して、sinまたはcos振幅を 2 ​​から 1に変更します。
つまり、カメラが 0、90、180、270、または 360 度で見ている場合、関数は 0 ~ 1 の値を返す必要があります。私は正しいですか?
最初の 0.5 は単なる移動速度です。

4

1 に答える 1

0

sin/の出力をcos0 - 1 の範囲にしたくないと思います。

特定の方向に移動ベクトルを生成しようとしている場合は、原点の周りの円内にポイントを生成する必要があります。これは、スケールとオフセットを適用する前のものとまったく同じです。代わりに、ポイント 0.5,0.5 の周りに円を生成しています。これを方向ベクトルとして使用すると、おそらく間違った方向を指しています。

方向 角度ベクトル あなたのベクトル 実際の方向
N 0 0, 1 0.5, 1 ~NNE
E 90 1, 0 1 , 0.5 ~ENE
S 180 0、-1 0.5、0 E
W 270 -1, 0 0 , 0.5 N

(結果が常に正であるため) 1 つの象限でのみ方向を生成できることに注意してください。

于 2013-04-01T09:01:09.963 に答える