Opengl Weird Rotation

Я пытаюсь повернуть простой треугольник. Проблема в том, что, хотя он вращается правильно, он уменьшает свой размер, пока не исчезнет.

Некоторые части моего кода на данный момент:

// 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. Возможно, лучший способ сделать это — использовать шейдер (поправьте меня, если я ошибаюсь), но я хотел упростить ситуацию, чтобы проиллюстрировать проблему.

2

Решение

Я считаю, что проблема в том, что когда вы вычисляете vertexArray[i+1] = (vertexArray[i] * sinf(theta)) + (vertexArray[i+1] * cosf(theta)); вы не используете значение vertexArray[i] из предыдущего итерация, а скорее новый vertexArray[i] вычисляется в первом присваивании цикла for.

Попробуй это:

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;
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]