Вращающийся объект Vertex Array не работает

Я использую массивы вершин для хранения вершин и цветов круга.

Вот функция настройки:

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. Я подозреваю, что существует некоторый специальный протокол, необходимый для вращения объекта, нарисованного с помощью массивов вершин.

Может кто-нибудь сказать мне, где я ошибся, что мне нужно будет сделать, чтобы повернуть объект, или дать какой-нибудь совет?

1

Решение

glRotatef(15, 1, 0, 0);
^ why the X axis?

Матрица ортопроекции по умолчанию имеет довольно узкие плоскости отсечения ближних / дальних расстояний: от -1 до 1.

Вращение вашего круга с координатами X / Y вне плоскости X / Y приведет к обрезанию этих точек.

Вместо этого поверните вокруг оси Z:

glRotatef(15, 0, 0, 1);
3

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


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