2016-11-04 10 views
1

私はニュートンクレードルをモデル化しています。現在、フレームに接続されている代わりに中心を中心に回転するので、ワイヤ/文字列の回転に問題があります。 「回転ポイントへの翻訳、回転、逆翻訳」とは別にオンライン上の情報はほとんどないようですが、これはうまくいかないようです。OpenGLの特定の点を中心に回転するオブジェクト

std::stack<glm::mat4>model; 
model.push(glm::mat4(1.0f)); 
model.top() = glm::translate(model.top(), glm::vec3(x, y, z)); 

model.top() = glm::rotate(model.top(), vx, glm::vec3(1, 0, 0)); //rotating in clockwise direction around x-axis 
model.top() = glm::rotate(model.top(), vy, glm::vec3(0, 1, 0)); //rotating in clockwise direction around y-axis 
model.top() = glm::rotate(model.top(), vz, glm::vec3(0, 0, 1)); //rotating in clockwise direction around z-axis 
model.top() = glm::scale(model.top(), glm::vec3(scale/40, scale*5, scale/40));//scale equally in all axis 
model.top() = glm::translate(model.top(), glm::vec3(-x, -y, -z)); 
glUniformMatrix4fv(modelID, 1, GL_FALSE, &model.top()[0][0]); 

glm::mat3 normalmatrix = glm::transpose(glm::inverse(glm::mat3(View * model.top()))); 
glUniformMatrix3fv(normalmatrixID, 1, GL_FALSE, &normalmatrix[0][0]) 

これは翻訳と回転のビット、または現在の繰り返しです。実際にはスタックは現時点では何もしません。 私の問題が分かりにくい場合は、アナログ時計アームを想像してください。アームの中心ではなく、時計の中心を中心に回転します。私はOpenGlの特定のポイントの周りにオブジェクトを回転させるネイティブ実装がないことを知っています

答えて

1

OpenGLでは、(GLSLの外に)任意のマトリックス素材の "ネイティブ"実装は廃止されました。

ここで問題となるのは、変換を掛け合わせて累積するのではなく、top()行列を値に設定することだけです。

また、後で(同じ行列に複数の行列を掛けた後に)同じ場所に戻ってこないという問題に気付くでしょう。これは、元の場所に戻す前にオブジェクトを大きく縮小しているためです。あなたの変換の順序が重要です。

おそらくあなたに非常に有用であろうこのようなもののすべての詳細な説明を提供し、このようなチュートリアル:

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/

関連する問題