私のプログラムでは、ウィンドウ上の任意の場所をクリックすることができ、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);
だから、私はループを取り除く言っている、と私は実行します。 – Jonathan
だから、私はループを取り除く言っている、定義Iゲームループの= 0外int型、および私が行います inputX =制御点[i]は。バツ; \t \t \t inputY = controlPoints [i] .y; i = i + 1; ; この場合、プログラムがクラッシュします。 – Jonathan
値を固定しますか? controlPoints.size() - 1の範囲内でなければなりません。インクリメント後にi = i%controlPonts.size()を試してください。 –