2017-11-04 19 views
1

キーを使用してキューブを回転したいとします。これはコードの一部です。 LEFTキーを押すと、キューブが左に回転します。私の目標はキューブを全周に回転させることです。そのため、問題の原因となるxy軸で回転させる必要があります。キーを使用したオブジェクトの回転

私はmat4 rotation;を定義し、キーを押したまま回転を割り当てるために使用しました。私はキーを保持すると、例えば左に回転しています。次に、キーを離し、オブジェクトが初期位置に戻ります(オブジェクトは移動していないので、カメラは元の位置に戻ります)。私はこの問題がキー機能の下に定義されているauto rotateMat = rotation;行を引き起こしていると思います。 私は何が間違っていますか?

mat4 rotation; //global 

    if(keysPressed[GLFW_KEY_LEFT]){ 
       timer -= delta; 
       rotation = rotate(mat4{}, timer * 0.5f, {0, 1, 0}); 
    } 

    if(keysPressed[GLFW_KEY_RIGHT]){ 
       timer += delta; 
       rotation = rotate(mat4{}, timer * 0.5f, {0, 1, 0}); 
    } 

    if(keysPressed[GLFW_KEY_UP]){ 
       timer += delta; 
       rotation = rotate(mat4{}, timer * 0.5f, {1, 0, 0}); 
    } 

    if(keysPressed[GLFW_KEY_DOWN]){ 
       timer -= delta; 
       rotation = rotate(mat4{}, timer * 0.5f, {1, 0, 0}); 
    } 

    ... 
    program.setUniform("ModelMatrix", rotation* cubeMat); 
    cube.render(); 

UPDATE:私はグローバル変数ではなくローカルとして行列変数を使用する場合

だから、これまで問題が解決しました。

+0

キーが押されていない場合、回転は1つの行列になります。そう、はい、ユニティ・マトリックスでrotateMatをオーバーライドすると、キューブは元の位置に戻ります。 – BDL

+0

@BDLどうすれば 'rotateMat'を上書きできないのですか?私は 'rotateMat'に' rotation'を割り当てると、最後の位置を覚えていると思いました。 – Ady96

+0

たとえば、ifsの相対回転を計算し、それを現在の行列に掛けることができます。 – BDL

答えて

0

このような相互作用をどのように実装できるかは、複数の方法があります。より簡単なものの一つではなくグローバルなもののすべてのフレームに相対的な翻訳を作成して、現在の回転にそれを追加することです。このため

、1はグローバルvarialbe内のすべての回転の合計を保存するために持っている

//Global variable 
mat4 total_rotate; 

そして、フレームごとの相対的な翻訳を計算します。別の方法として

//In the function 
mat4 rotation; 

if(keysPressed[GLFW_KEY_LEFT]){ 
      rotation = rotate(mat4{}, delta, {0, 1, 0}); 
} 

if(keysPressed[GLFW_KEY_RIGHT]){ 
      rotation = rotate(mat4{}, -delta, {0, 1, 0}); 
} 

if(keysPressed[GLFW_KEY_UP]){ 
      rotation = rotate(mat4{}, delta, {1, 0, 0}); 
} 

if(keysPressed[GLFW_KEY_DOWN]){ 
      rotation = rotate(mat4{}, -delta, {1, 0, 0}); 
} 

total_rotate = total_rotate * rotation; 
... 
program.setUniform("ModelMatrix", total_rotate * cubeMat); 
cube.render(); 

を、あなたの代わりに2つの回転角を保存し、すべてのフレームに行列を計算することができます:

//Global variables 
float rot_x = 0.0f, rot_y = 0.0f; 

//In every frame  
if(keysPressed[GLFW_KEY_LEFT]){ 
      rot_x += delta; 
} 

if(keysPressed[GLFW_KEY_RIGHT]){ 
      rot_x -= delta; 
} 

//Same for y 

auto rotation = rotate(rotate(mat4{}, rot_y, {0, 1, 0}), rot_x, {1, 0, 0} 
... 
program.setUniform("ModelMatrix", rotation * cubeMat); 
cube.render(); 
+0

最初の解決策は私のためには機能しません。それは最初の位置に戻ります。 – Ady96

+0

'total_rotate'をグローバル変数として宣言しましたか? total_rotateをどこかでオーバーライドまたはリセットしない限り、元に戻ってはいけません。 – BDL

+0

これは 'onIdle()override '関数内にありますが、それをリセットしてはいけません。そして2番目の解決策では、それは回転したいと思いますが、動きを妨げるものがありません。キーを押して移動すると、最初の位置で「振る」だけです。 – Ady96

関連する問題