2013-07-11 2 views
1

Я разбираю 3D-файл в OpenGL ES на устройстве iOS, и после того, как я получу вершины, я не могу добавить их в GLfloat, содержащий мои вершины. В верхней части моего файла я объявляю GLfloat:OpenGL Добавить вершины после загрузки

GLfloat gFileVertices[] = { 
     -0.686713, 0.346845, 3.725390,   -0.000288, -0.000652, -0.000109, 
     -0.677196, 0.350971, 3.675733,   -0.000288, -0.000652, -0.000109, 
     -0.673889, 0.340921, 3.726985,   -0.000288, -0.000652, -0.000109, 
     -0.677424, 0.337048, 3.775731,   -0.000283, -0.000631, -0.000071, 
     And so on... 
    } 

Но как я могу положить, что одни и те же данные (х, у, г normal.x, normal.y, normal.z) в этом массиве в экземпляре в котором каждый из них является переменными и существует переменное количество строк?

+0

Что вы хотите сделать? –

+0

Я хочу рассчитать эти данные, которые я привел выше, но для уникального файла, который выполняет пользователь моего приложения. Так что я не понимаю, как это сделать, это взять эти данные после того, как я вычислил его для этого файла, а затем поместил в переменную gFileVertices. Проблема в том, что мне приходится учитывать переменное количество строк, и если я помещаю цикл for для распечатки каждой строки вычисляемых вершин и нормалей в gFileVertices, то я получаю сообщение об ошибке, потому что я не могу поместить код в только числа gFileVertices. – harryisaac

+0

Вы должны пересмотреть свои теги вопроса, это больше связано с программированием 'C', чем' opengl' – rotoglup

ответ

0

Решение состоит в том, чтобы динамически распределять буфер вершин во время выполнения, а не статически во время компиляции. В коде нет способа изменить размер gFileVertices после компиляции программы.

Для управления я вместо этого буду использовать отдельный массив нормалей и вершин вместо чередования данных в один.

Чтобы проанализировать файл, определите количество вершин и выделите буферы.

GLfloat* verticesBuff = malloc(sizeof(GLfloat) * vertCount * 3); /* 3 floats per vert */ 
GLfloat* normalsBuff = malloc(sizeof(GLfloat) * vertCount * 3); /* 3 floats per vert */ 

Затем скопируйте каждый элемент в новый массив:

/* read from file or whatevs */ 
    for (int i = 0; i < vertCount; i ++) 
    { 
     verticesBuff[i * 3] = ... 
     verticesBuff[i * 3 + 1] = ... 
     verticesBuff[i * 3 + 2] = ... 

     normalsBuff[i * 3] = ... 
     normalsBuff[i * 3 + 1] = ... 
     normalsBuff[i * 3 + 2] = ... 

    } 

Динамические массивы могут быть использованы в OpenGL так же, как статическое:

glVertexPointer(3, GL_FLOAT, 0, verticesBuff); 
glNormalPointer(GL_FLOAT, 0, normalsBuff); 

Thats это! Просто не забудьте удалить, когда вы закончите:

free(verticesBuff); 
free(normalsBuff); 
+0

Хорошо, но как мне установить три отдельных поплавка для каждой вершины и нормали? – harryisaac

+0

@ user1795671 Извините, я сделал ошибку - отредактирован, чтобы показать, как назначается каждый элемент. –

+0

Итак, если я понимаю, я бы поместил первый фрагмент кода в свой viewDidLoad или когда я настроил openGL, я включил этот второй код с моими собственными вычисленными данными после того, как я разобрал свой 3D-файл, а третья часть в моем openGL настроить и снова вызвать настройку после ввода второй части, а последний фрагмент будет использоваться для выгрузки этих буферов на dealloc? – harryisaac

Смежные вопросы