2

単純な三角形を回転させようとしています。問題は、正しく回転している間、消えるまでサイズが小さくなることです。

これまでの私のコードのいくつかの部分:

// Vertices
GLfloat vertexArray[] = 
{
    1.0f, -1.0f, 0.0f,
    -1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};

// Render funcion (called every frame)
void render()
{
    glClearColor(0.0f, 0.0f, 0.4f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObj);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexArray), vertexArray, GL_DYNAMIC_DRAW); 
    glUseProgram(programID); // simple vertex/frag shader

    glDrawArrays(GL_TRIANGLES, 0, 3);

    // Swap buffers
    glfwSwapBuffers();
}

// Update funcion (called every frame before render function)
void update(float elapsedTime)
{
    printf("elapsedTime: %f \r", elapsedTime);

    float static theta = elapsedTime * 0.2f;

    for(int i = 0; i < 9; i+=3)
    {
        vertexArray[i] =   (vertexArray[i] * cosf(theta)) - (vertexArray[i+1] * sinf(theta));
        vertexArray[i+1] = (vertexArray[i] * sinf(theta)) + (vertexArray[i+1] * cosf(theta));
        vertexArray[i+2] = 0;
    }
}

ご覧のとおり、更新関数のすべての頂点を for ループで回転させています。これを行う最善の方法はシェーダーを使用することかもしれません (間違っている場合は訂正してください) が、ここでは問題を説明するためだけに物事を単純にしたかったのです。

4

1 に答える 1

3

問題は、計算するときに、前の反復vertexArray[i+1] = (vertexArray[i] * sinf(theta)) + (vertexArray[i+1] * cosf(theta));からの値を使用しているのではなく、 for ループの最初の割り当てで計算された新しい値を使用していることだと思います。vertexArray[i] vertexArray[i]

これを試して:

for(int i = 0; i < 9; i+=3)
{
    double tmp = vertexArray[i];

    vertexArray[i] = (tmp * cosf(theta)) - (vertexArray[i+1] * sinf(theta));
    vertexArray[i+1] = (tmp * sinf(theta)) + (vertexArray[i+1] * cosf(theta));
    vertexArray[i+2] = 0;
}
于 2013-01-10T21:04:46.357 に答える