2016-10-14 6 views
0

私のプログラムでは、ウィンドウ上の任意の場所をクリックすることができ、Enterキーを押すと、その点に沿って線をトレースします。また、スペースを押すと、最初の点に三角形が描かれ、行全体を最後まで移動してから開始点に戻り、繰り返します。Openglのユーザ定義行に沿ってオブジェクトを移動する方法

開始点の線をトレースして三角形を描くようにしたので、翻訳の動きも出てきました。私の唯一の問題は、ラインがどのようになっても右下に移動し続けるということです。どのように私は方向を得ている必要がありますが、私は間違っているか分からない。

最初に三角形を描いています。ユーザー定義のポイントは、controlPointsというglm :: vec3変数で定義されています。だから私は、1点目の三角形作成(VAOにバインドさ、それはその後、VBOに渡されると、など[triangleVerticesもGLM :: vec3変数である]):に続いて

 // Lower-left vertex 
     triangleVertices.push_back(glm::vec3(controlPoints[0].x - 30.0f, controlPoints[0].y + 30.0f, controlPoints[0].z)); 

     // Lower-right vertex 
     triangleVertices.push_back(glm::vec3(controlPoints[0].x + 30.0f, controlPoints[0].y + 30.0f, controlPoints[0].z)); 

     // Upper-center vertex 
     triangleVertices.push_back(glm::vec3(controlPoints[0].x, controlPoints[0].y, controlPoints[0].z)); 

     // Bind VAO for the triangle 
     glBindVertexArray(VAOTriangle); 

     // Bind and implement VBO for the triangle 
     glBindBuffer(GL_ARRAY_BUFFER, VBOTriangle); 
     glBufferData(GL_ARRAY_BUFFER, triangleVertices.size() * sizeof(glm::vec3), triangleVertices.data(), GL_STATIC_DRAW); 

     // Connecting coordinates to shader 
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); 
     glEnableVertexAttribArray(0); 

     // Unbind VAO 
     glBindVertexArray(0); 

私のゲームループは、ここ(モデル行列がすでにオブジェクトがすでにバインドされているため、シェーダ内の位置に乗じなっている)私は翻訳を行う方法は次のとおりです。

 glBindVertexArray(VAOTriangle); 

     float inputX = 0.0; 
     float inputY = 0.0; 

     GLfloat deltaTime = 0.0f; 
     GLfloat lastFrame = 0.0f; 
     GLfloat currentFrame = glfwGetTime(); 
     deltaTime = currentFrame - lastFrame; 
     lastFrame = currentFrame; 

     GLfloat speed = 5.0f * deltaTime; 
     glm::vec2 direction; 

     for (int i = 0; i < controlPoints.size(); i++) 
     { 
      inputX = controlPoints[i].x; 
      inputY = controlPoints[i].y; 
      direction.x = inputX * float((speed * deltaTime)/1000.0f); 
      direction.y = inputY * float((speed * deltaTime)/1000.0f); 

      model_matrix = glm::translate(model_matrix, glm::vec3(direction, 0.0f));  
      glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(model_matrix));  
     } 

     glDrawArrays(GL_TRIANGLES, 0, triangleVertices.size()); 


     glBindVertexArray(0); 

私はのためのループでglDrawArraysを入れた場合は、ポイントと同じ量の三角形を作成します。これは私が望むものではありません(ちょうど1つの三角形)。しかし、このように、最後の点の方向しか取らないように見えます。なぜなら、ループ全体が終了すると描画されるからです。しかしそれはどちらもしません。私が言ったように、それは線の構造に関係なく、右下がり(窓から消えるまで)です。

編集:

ここで線に沿ってオブジェクトを移動する方法についての私の新しい設定があります。私が何をするにしても、それは右下がりの方向に向かっています。

 glBindVertexArray(VAOTriangle); 

     // Getting time to define translation speed 
     GLfloat deltaTime = 0.0f; 
     GLfloat lastFrame = 0.0f; 
     GLfloat currentFrame = glfwGetTime(); 
     deltaTime = currentFrame - lastFrame; 
     lastFrame = currentFrame; 
     GLfloat speed = 3.0f * deltaTime; 

     // Going through all points of the line 
     translationX = controlPoints[translationIndex].x; 
     translationY = controlPoints[translationIndex].y; 

     if (translationIndex < controlPoints.size() - 1) 
     { 
      translationIndex++; 
      translationIndex %= controlPoints.size(); 
     } 

     // Update direction vector 
     translationDirection.x = translationX * float((speed * deltaTime)/1000.0f); 
     translationDirection.y = translationY * float((speed * deltaTime)/1000.0f); 
     model_matrix = glm::translate(model_matrix, glm::vec3(translationDirection, 0.0f)); 
     glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(model_matrix));  
     glDrawArrays(GL_TRIANGLES, 0, triangleVertices.size());  
     glBindVertexArray(0); 

答えて

0

glUniformMatrix4fvの問題については、直ちにcontrolPoints配列全体を反復処理しています。

これを削除して、 "i"変数を置き換える値(各フレームまたは特定のステップ)を増やしてください。

+0

だから、私はループを取り除く言っている、と私は実行します。 – Jonathan

+0

だから、私はループを取り除く言っている、定義Iゲームループの= 0外int型、および私が行います inputX =制御点[i]は。バツ; \t \t \t inputY = controlPoints [i] .y; i = i + 1; ; この場合、プログラムがクラッシュします。 – Jonathan

+0

値を固定しますか? controlPoints.size() - 1の範囲内でなければなりません。インクリメント後にi = i%controlPonts.size()を試してください。 –

関連する問題