Вычислить вершины круга
У меня простая программа, она рисует круг:/ Это отлично работает...
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
Вы, вероятно, хотите, чтобы ваша первая точка была центром круга.