2016-05-18 11 views
0

2つの立方体を持つシーンがあり、1つの立方体だけを拡大することができます。基本的には、S大文字キーを押すと、大文字のSを押し続けるほどキューブが大きくなり続けます。小文字を押すと、キューブを小さくすることができます。小文字のsを押すと長くなります。シーン内の1つのオブジェクトのみのスケーリング - OpenGL 3.0

私は2つの問題に実行している:私は押されたキーが下ケースまたは大文字であるかどうかを検出する方法がわからない

  1. 私のシーン全体(両方の立方体のように)は、キーを押すと拡大したり縮小したりします。

ここでは、キーの私のコードです:

void keyPressed(GLFWwindow *_window, int key, int scancode, int action, int mods) { 

// Control the state of keys pressed 
if (action == GLFW_PRESS) 
    keys[key] = true; 
else if (action == GLFW_RELEASE) 
    keys[key] = false; 

switch (key) { 
    case GLFW_KEY_ESCAPE: glfwSetWindowShouldClose(_window, GL_TRUE); break; 

    // Change between points, lines and fill 
    case GLFW_KEY_P: glPolygonMode(GL_FRONT_AND_BACK, getMode('P')); break; 
    case GLFW_KEY_W: glPolygonMode(GL_FRONT_AND_BACK, getMode('W')); break; 
    case GLFW_KEY_T: glPolygonMode(GL_FRONT_AND_BACK, getMode('T')); break; 

    case GLFW_KEY_S: scale_matrix = scale(scale_matrix, vec3(2.0f, 2.0f, 2.0f)); 

        //model_matrix = scale(model_matrix, vec3(2.0f, 2.0f, 2.0f)); 
        break; 

    case GLFW_KEY_R: scale_matrix = scale(scale_matrix, vec3(0.5f, 0.5f, 0.5f)); 
        //model_matrix = scale(model_matrix, vec3(0.0f, 0.0f, -1.0f)); 
        break; 


    //Reset camera 
    case GLFW_KEY_D: cameraPosition = vec3(0.0, 0.0, 1.0); 
        view_matrix = lookAt(
         cameraPosition, 
         vec3(0.0f, 0.0f, -100.0f), 
         vec3(0.0, 1.0, 0.0)); 
        break; 
    default: break; 
} 
return;} 

私は、大文字と小文字を検出する方法については確認されませんでしたので、私は、シーンを縮小するためのキーとしてRを割り当て。これは私のキューブの位置のためのコードです:

glm::vec3 cubePositions[] = { 
glm::vec3(0.0f, 0.0f, -1.0f), 
glm::vec3(2.0f, 10.0f, -10.0f), 
}; 

私はケースのためにif文を使用していたこれまでにしようとしているもの:キューブの位置を確認するためにGLFW_KEY_Sが、それは動作しませんでした。

答えて

0

ほとんどのライブラリは大文字と小文字のキーを認識しません。 Shiftキーも同時に押されたことを検出することで、これを自分で行う必要があります。

スケーリングの場合は、 1つのキューブをレンダリングする前にのみ行列を掛けて、元の状態に戻す必要があります。 OGLマトリックスシステムを使用する場合は、このようにしてください。シェーダを使用している場合

glLoadIdentity(); 
glMultMatrix(view_matrix); 
// 1st cube 
glPushMatrix(); 
glMultMatrix(scale_matrix); 
drawCube(); 
glPopMatrix; 

// 2nd cube 
glPushMatrix(); 
drawCube(); 
glPopMatrix; 

:固定機能パイプラインを使用している場合

mat4 modelview; 

modelview = view_matrix; 
glUniformMatrix4fv(location_modelview, 1, GL_FLASE, modelview); 
drawCube(); 

modelview = view_matrix * scale_matrix 
glUniformMatrix4fv(location_modelview, 1, GL_FLASE, modelview); 
drawCube(); 

を、あなたの行列を乗算している場合はyourslefが、あなたは内のすべてのオブジェクトごとに異なるオブジェクト - >世界の行列を維持する必要がありますシーンを別々に

私は廃止された機能を今気にかけません。まずあなたが望むものを手に入れ、後でそれをより良くする方法を見つけようとします。

+1

OPは固定機能パイプラインを使用していない可能性があります。 – datenwolf

0

一つ私が押されたキーがキー修飾子は、あなたの場合には、押された場合は、テストの小文字または大文字そのために

であるかどうかを検出する方法がわからないということです"shift"修飾キー。

と第二(両方の立方体のように)私のシーン全体

OpenGLは、描画APIではなく、シーングラフであること。ありますしたがって、スケーリングされるべきモデルを描画するときにのみスケーリング行列を適用し、残りのスケーリング行列は省略します。

関連する問題