Я использую массивы вершин для хранения вершин и цветов круга.
Вот функция настройки:
void setup1(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
// Enable two vertex arrays: co-ordinates and color.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
// Specify locations for the co-ordinates and color arrays.
glVertexPointer(3, GL_FLOAT, 0, Vertices1);
glColorPointer(3, GL_FLOAT, 0, Colors1);
}
Глобальная декларация массивов здесь:
static float Vertices1[500] = { 0 };
static float Colors1[500] = { 0 };
Здесь все массивы установлены (R — радиус, X и Y — центр (X, Y), а t — параметр угла окружности)
void doGlobals1()
{
for (int i = 0; i < numVertices1 * 3; i += 3)
{
Vertices1[i] = X + R * cos(t);
Vertices1[i + 1] = Y + R * sin(t);
Vertices1[i + 2] = 0.0;
t += 2 * PI / numVertices1;
}
for (int j = 0; j < numVertices1 * 3; j += 3)
{
Colors1[j] = (float)rand() / (float)RAND_MAX;
Colors1[j + 1] = (float)rand() / (float)RAND_MAX;
Colors1[j + 2] = (float)rand() / (float)RAND_MAX;
}
}
Наконец, это где фигура рисуется.
// Window 1 drawing routine.
void drawScene1(void)
{
glutSetWindow(win1);
glLoadIdentity();
doGlobals1();
glClear(GL_COLOR_BUFFER_BIT);
glRotatef(15, 1, 0, 0);
glDrawArrays(GL_TRIANGLE_FAN, 0, numVertices1);
glFlush();
}
Без поворота круг рисует просто отлично. Круг также хорошо рисует с любой функцией Scale / Translate. Я подозреваю, что существует некоторый специальный протокол, необходимый для вращения объекта, нарисованного с помощью массивов вершин.
Может кто-нибудь сказать мне, где я ошибся, что мне нужно будет сделать, чтобы повернуть объект, или дать какой-нибудь совет?
glRotatef(15, 1, 0, 0);
^ why the X axis?
Матрица ортопроекции по умолчанию имеет довольно узкие плоскости отсечения ближних / дальних расстояний: от -1 до 1.
Вращение вашего круга с координатами X / Y вне плоскости X / Y приведет к обрезанию этих точек.
Вместо этого поверните вокруг оси Z:
glRotatef(15, 0, 0, 1);