Вычислить вершины круга

У меня простая программа, она рисует круг:/ Это отлично работает...

for (k = 1; k < n+1+1; k++){
 vertices[k].color = GU_COLOR( 0.0f, 0.0f, 1.0f, 0.0f );
 vertices[k].x = cos_d( 360 - ((k-1) * dstep) );
 vertices[k].y = sin_d( 360 - ((k-1) * dstep) );
 vertices[k].z = 0.0f;
}
...
//Now draw it
sceGumDrawArray(GU_TRIANGLE_FAN, GU_COLOR_8888|GU_VERTEX_32BITF|GU_TRANSFORM_3D, n+1+1, 0, vertices);

Но это не так:

for (k = 1; k < n+1+1; k++){
 vertices[k].color = GU_COLOR( 0.0f, 0.0f, 1.0f, 0.0f );
 vertices[k].x = cos_d( ((k-1) * dstep) );
 vertices[k].y = sin_d( ((k-1) * dstep) );
 vertices[k].z = 0.0f;
}

Но не должно ли это быть одинаково - только с той разницей, что первый цикл вычисляет вершины по часовой стрелке, а второй - против часовой стрелки? Просто неловко, что он не рисует вершины, используя второй пример...

Или я тупой?

4 ответа

Решение

Не совсем уверен, как вы рисуете круг (я вижу, что вы создаете список вершин, но ничего не знаете об их отображении), но:

Обычно, когда вы инвертируете по часовой стрелке против часовой стрелки, вы получаете инвертированную нормаль, что означает, что вы смотрите в конец круга. И, как в случае с большинством API, при взгляде на что-то заднее (не имеющее объема) оно не отображается.

Это называется отбором задних поверхностей.

Это не может быть нарисовано из -за отбраковки задней поверхности.

"Если пользователь указал, что передние многоугольники имеют намотку по часовой стрелке, если многоугольник, проецируемый на экран, имеет намотку против часовой стрелки, он повернут в сторону от камеры и не будет нарисован".

Я не знаю библиотеку, которую вы используете, но вы уверены, что не смешиваете радианы и градусы в своем коде? Функции sin и cos принимают радианы или градусы?

Предположительно dstep это 360 / n?

Как эстетическая точка, с GL_TRIANGLE_FAN Вы, вероятно, хотите, чтобы ваша первая точка была центром круга.

Другие вопросы по тегам