2016-06-22 4 views
2

私は、OpenGLの3dポイントでいくつかの変換を行う方法を学ぼうとしています。 Using this cheat sheet私は回転させたいベクトルに乗算するための正しい行列を持っていると思います。しかし、私が新しい貨幣を掛けて印刷するとき、それは間違っていると信じています。 (1,0,0回転すると0,0,0が正しいはずです)なぜこれが機能しないのですか?なぜ私のベクトルは正しく回転しませんOpenGL/GLM?

マイコード:

glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f); 
glm::mat4 trans = { 
    1.0f, 0.0f, 0.0f, 0.0f, 
    0.0f, cos(glm::radians(90.0f)), -sin(glm::radians(90.0f)), 0.0f, 
    0.0f, sin(glm::radians(90.0f)), cos(glm::radians(90.0f)), 0, 
    0.0f, 0.0f, 0.0f, 1.0f 
}; 
vec = trans * vec; //I should get 0.0, 1.0, 0.0 right? 
std::cout << vec.x << ", " << vec.y << ", " << vec.z << std::endl; 

上記プリント1.0, 0.0, 0.0全く変化がないことを示していますか?

また、GLMのrotate関数を使用して、手動で指定するのではなく行列を生成しようとしましたが、正しいと思われるものが得られませんでした。

glm::mat4 trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0)); //EDIT: my bad, should've been z axis not x, still not working 

上記プリント:-2.14..e+08, -2.14..e+08, -2.14..e+08

(PS:数学が間違っている場合、私はちょうど、前の学年で私の謝罪をジオメトリを取った私は、私が選んだの行列と行列の乗算の基本的な理解を持っています。今日はOpenGL変換を学んでいますが、それ以外の場合はこれで私のようなものです)

+0

入力が(1,0,0,1)で、出力が(0,1,0,1)である必要がある場合、回転はZ軸の周りにある必要があります。 –

+0

@HannesHauptmann ok、私はその変更をしようとしましたが、それでも正しい答えを返さない 'glm :: mat4 trans = glm :: rotate(trans、90.0f、glm :: vec3(0.0、0.0、1.0)) ; ' –

+0

左側にOpenGLがどのように処理しているのかが分かります。私は100%ですが、これはZ軸周りの回転です:) –

答えて

4

あなたのコードでは、x軸の周りにx軸の の単位ベクトルを回転していますが、ベクトルを変更しません( 鉛筆を回転させると、方向は変わりませんすべて)。 glm::mat4 trans = glm::rotate(trans, 90.0f, glm::vec3(0.0, 0.0, 1.0));がにトランス必要があるため、希望する結果を返していない、そのほかに

glm::mat4 trans = { 
    cos(glm::radians(90.0f)), -sin(glm::radians(90.0f)), 0.0f, 0.0f, 
    sin(glm::radians(90.0f)), cos(glm::radians(90.0f)), 0.0f, 0.0f, 
    0.0f, 0.0f, 1.0f, 0.0f, 
    0.0f, 0.0f, 0.0f, 1.0f 
}; 

は、あなたがこのような行列を使用して、z軸の周りに ベクトルを回転させる必要があり、以前に望んでいたものを達成するために、 glm :: rotateに渡す前に初期化してください。このようにそれを書いてみますGLM ::ラジアンとCOS /銭を使用した場合

glm::mat4 trans; // Default constructor called, trans is an identity matrix 
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0)); 

それでも、あなたが原因精度の損失を予想ベクトル(は0.0f、1.0F、は0.0f)を得られない可能性があります。私のテストでは、ベクトル(-4.37113883e-008f、1.0f、0.0f)が得られ、-4.37113883e-008は実際には-0.0000000437113883であり、予想される結果である0に非常に近い数値です。

+0

ああ、ありがとう。これはまた@HannesHauptmannが私に言っていたものです。 –

+0

rotate()コマンドで混乱したのは、私がjavaに慣れていたからです。私はmat4がobjであることに気づいていませんでした。なぜなら、それはコンストラクタで初期化されたことを決して実感できませんでした(Javaではnewを使い、明示的にコンストラクタを呼び出すからです。これはC++が私を混乱させる理由です –

2

あなた自身の回転行列が入力を変更していない理由は簡単です。回転はy座標とz座標にのみ影響し、結果はゼロです。結果は入力とまったく同じです。 X座標は出力x座標に1の乗数を持ちますので、同じままです。

たとえば、ベクター1.0, 2.0, 3.0, 1.0を作成すると、変更が表示されます。

glmバージョンでは、なぜそれが奇妙な結果をもたらすのかを言い表すことはできませんが、私はそれらに問題は一度もなく、あまり使用していません。

+0

迅速な答えサミに感謝します。 +1が役に立ったからです。私はJeanを受け入れています。なぜなら、より多くの情報を持っているからです(なぜ 'rotate()')コマンドが機能しないのかを説明しています。あなたが気にしないことを願っています。 –

関連する問題