これはシンプルでわかりやすいと思いましたが、そうではありません。openGLアプリケーションにカメラがあり、表示された画像をそれぞれカメラの「場所」に変換しています。とによって位置が変更されUpますDown。Leftと を使用してカメラを回転させることができます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 は単なる移動速度です。