4

私はしばらくの間、SFML 1.6 で OpenGL を使用してきました。例外が 1 つあります。カメラ クラスを正しく実装できないようです。ご覧のとおり、「Camera」という C++ クラスを作成しようとしています。ここに私の機能があります:

Camera::Strafe(float fSpeed)

WASD キーが押されているかどうかを確認し、押されている場合は、それぞれの方向に「fSpeed」でカメラを動かします。

Camera::MouseMove(int currentX, int currentY)

現在のマウス座標を取得し、それに応じてカメラを回転させて、一人称マウスの外観を提供する必要があります。私の Strafe() 実装は正常に動作しますが、MouseMove() を正しく取得できないようです。

OpenGL マウス ルックの実装に関する他のリソースを読んで、すべてのフレームの後にマウスを中央に配置する必要があることを既に知っています。しかし、それはそれについてです。マウス座標からその場で実際にカメラを回転させる方法がわからないようです。おそらくいくつかのトリガーを使用する必要があると思います。

4

1 に答える 1

0

私はこれに似たようなことをしました(それは三人称カメラでした)。正しく行ったことを覚えていれば、マウスの位置の変更を取り、それを使用して 2 つの角度を計算しました (何らかの三角関数で計算したと思います)。ある角度では水平方向に回転し、別の角度では垂直方向に回転しました。具体的には、ピッチ、ヨー、ロールですが、どれがどの方向を指しているのか思い出せません。他の前にやらなければならないこともあります。最初はピッチで、次にヨーまたはロールだったと確信しています。

うまくいけば、マウスの位置の変化が何をしたかが明らかになるはずです。これにより、マウスの感度が向上しました。マウスを速く動かすと変化が大きくなるので、「速く」回転します。

編集:わかりました、私は自分のコードを見て、それは非常に単純な計算です.

これは C# で行われたため、構文についてはご容赦ください。

_angles.X += MathHelper.ToDegrees(changeInX / 100);
_angles.Y += MathHelper.ToDegrees(changeInY / 100);

私の角度は 2 次元ベクトルに格納されていました (2 つの軸でのみ回転したため)。changeInX と changeInY の値を単純に 100 で割って任意のラジアン値を取得し、その数値を度数に変換したことがわかります。感度の 100 を調整します。ここでは、これを理解するための具体的な計算は行われていないことに注意してください。うまく機能するものが得られるまで、試行錯誤を繰り返しました。

于 2011-07-13T18:12:43.827 に答える