2016-09-04 5 views
2

私はオブジェクトを表示するプログラムを持っています。 まず、ファイルから位置p.x、p.y、p.zおよび位取りs.x、s.y、s.zをロードします。 次に、それらを4x4 ModelMatrixに適用し、多くの変換とスケール操作を実行します。OpenGL - glm変換と縮尺設定

私が最初にオブジェクトをロードすると、私はps値を使用します。プログラムの中に私は規模と翻訳の操作を実行して、バックファイルへのpとsの値を保存しながら

modelMatrix = glm::mat4(1.0)); 

/*Translations*/ 
modelMatrix = glm::translate(modelMatrix, glm::vec3(p.x, p.y, p.z)); 
modelMatrix = glm::scale(modelMatrix, glm::vec3(s.x, s.y, s,z)); 

を。

void Display::Translate(double x, double y, double z) 
{ 
    modelMatrix = glm::translate(modelMatrix, glm::vec3(x,y,z)); 
    p.x += x; //that way p is composition of all translations 
    p.y += y; 
    p.z += z; 
} 

void Display::Scale(double x, double y, double z) 
{ 
    modelMatrix = glm::scale(modelMatrix, glm::vec3(x,y,z)); 
    s.x *= x; //that way s is composition of all scalings 
    s.y *= y; 
    s.z *= z; 
} 

今の問題は、(プログラムを再度実行している)、再びロードした後に、オブジェクトが、私はそれらを保存場所ではありませんが、いくつかのではなく、ランダムな場所ということです。 (特に翻訳)。 私は間違った方法で変換を構成していますか(翻訳ではx、y、zに加え、スケーリングで掛ける)?

+1

あなたが私たちに言わせてもらえなかったので、あなたがファイルに保存して読み込んでいるものが何であるか分かりません - あなたのエラーがそこに見つかる可能性が高いからですが、その変換がaren可換性 - 最初に翻訳を行い、その後にスケールを行うと、結果は一般的なケースで最初にスケールを実行してから翻訳と異なることになります。変換をファイルに保存する場合は、すべての変換の合計とすべてのスケールの合計ではなく、完全な変換行列を保存します。 – Cubic

答えて

1

私は間違った方法で変換を構成していますか(x、y、zを翻訳に追加し、スケーリングを掛ける)か?

翻訳が実際に拡大縮小されているため、これは間違いです。より良い方法は、モデル行列からスケールと平行移動を抽出することです。翻訳はw列(右端の列)にあり、スケールは左上の3×3サブマトリックスにあります。単純なケースは対角要素に過ぎませんが、回転が適用されている場合は、長軸(https://en.wikipedia.org/wiki/Principal_axis_theorem)を決定するか、それをばらまくだけでスケールの列ベクトルの長さを取る必要があります。

+0

はい、回転もあります。私は代わりにmodelMAtrixを代わりに格納すると思います(10の代わりに16の数字/スケール、回転+四元数)。 –

関連する問題