2017-09-16 9 views
2

カーソルを常に向いている間に2Dスプライトを回転させたい。カーソルの向きopenGL C++

私は喜んで、SDL2 & glmを数学に使用しています。

私が試みた「元の」方法は、オブジェクトの前と私の望むLookAtベクトルとの間の角度を計算し、角度を度で入れてglm::rotateの行列にすることでした。 それはいくつかの奇妙な理由のためにうまくいかなかった。 もう1つの方法は、クォート内でそれを行い、モデル行列にクォートを適用することでしたが、どちらも役に立ちませんでした。

オブジェクトの中心が原点(0,0,0)に表示されるため、回転のための変換は必要ありません。

テクスチャを読み込む矩形を作るために2つの三角形を描画します。

マイモデル行列は、理論的には以下のようになります。

model = rotate * scale; 

私は、シェーダにプラグイン(位置は私のvec3頂点である場合)

position = projection * view * model * vec4(Position, 1.0f); 

I場合は、最初の奇妙なことが、ありますハードコード90.0fを角度としてglm::rotateに入力すると、オブジェクトは実際に時計回りに約120°回転します。 80°のプラグを差し込むと、実際に時計回りに約250°回転します。 45度に差し込むと時計回りに45度回転します。 全ての回転は例えば、z軸の周りにある:

model = glm::rotate(model, 90.0f, glm::vec3(0.0f,0.0f,1.0f); 

私は方向性をシミュレートするために、四元数を使用している場合、それは私が0,2 & 0.9ラジアンの間の角度与え、私のオブジェクトのみを回転させているようです0.0°&の時計回りに45°の間で、どこにカーソルを置いても問題ありません。

角度btwを計算すると、私の2つのベクトル(ObjectLookAt & MousePosition)とそれらを格納しても、私はかなり正確な角度を取得しますが、glm :: rotate関数は期待通りに機能しません。最後に

私は単に角度コーディングする場合:それは実際にはさらに多くの奇妙な回転1で始まり

float angle = static_cast<float>(SDL_GetTicks()/1000); 

を。 私はそれが1秒(1秒で始まる)でレートを開始し、360秒以上経過するまでz軸を中心に完全な円を回転させることを期待しています。 しかし、約6秒で360°回転します。角に追加されて度合いとしてglm::rotateに差し込まれた「1」は60°を表します。

これは私のロジックの欠陥ですか?スプライトがx-y平面上に描かれている場合、z軸の周りを回転させませんか? 私はここでもx軸&を試してみましたが、これはうまくいきませんでした。 ..私は本当にすべてが「2D」に起こる特にとして、私はそれは理論的には動作するはずですどのように取得する(と思う)、ここで立ち往生していますが、私はそれが仕事を得ることができない

答えて

2

最初の奇妙なことがあり、私がglm :: rotateに90.0fの角度をハードコードすると、オブジェクトは実際に時計回りに約120°回転します。私が80°のプラグを差し込むと実際に時計回りに約250°回転します。 45°のプラグを差し込むと時計回りに45°回転します。

関数glm::rotateは、(GLMバージョン0.9.6以降の)角度がラジアンであるためです。

このようにコードを適応:

model = glm::rotate(model, glm::radians(angel_degrees), glm::vec3(0.0f,0.0f,1.0f); 

も参照してください。

+1

は、特に、高速のために、ありがとうございました応答!それは、より良い、奇妙なそれは[ドキュメント](https://glm.g-truc.net/0.9.3/api/a00147.html#gaacb9cbe8f93a8fef9dc3e25559df19c0)で角度が度で与えられるべきだと言う.. 残りは今私の数学をやっているはずです。 – Schloemmel