У меня есть приложение на основе OpenGL ES, которое анализирует информацию из файла XML с помощью NSXMLParser.Поскольку информация о вершинах поступает для каждого объекта сцены в файле, я сохраняю ее в NSMutableArray следующим образом:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (floatArray) {
if (currentlyParsing == kVerticeInformation) {
if (currentParserTagType == kGeometry) {
//NSLog(@"Loaded Vertices %@", string);
NSArray * nums = [string componentsSeparatedByString:@" "];
culmunativeCount += [nums count];
//NSLog(@"Culm Count is %d", culmunativeCount);
[fullParseString appendString : string];
if (checkSumCount <= culmunativeCount) {
//NSLog(@"Full Parse String is %@", fullParseString);
NSArray * finishedArray = [fullParseString componentsSeparatedByString:@" "];
//NSLog(@"Finihsed ARray is %d", [finishedArray count]);
[finishedParsingArray addObjectsFromArray:finishedArray];
//NSLog(@" FINISHED PARSING = %d", [finishedParsingArray count]);
NSUInteger baseIndex;
for (baseIndex=0; baseIndex <[finishedParsingArray count]; baseIndex +=3) {
NSString * xPoint = [finishedParsingArray objectAtIndex:baseIndex];
NSDecimalNumber * errorCheckX = [NSDecimalNumber decimalNumberWithString:xPoint];
float x = [errorCheckX floatValue];
NSString * yPoint = [finishedParsingArray objectAtIndex:baseIndex +1];
NSDecimalNumber * errorCheckY = [NSDecimalNumber decimalNumberWithString:yPoint];
float y = [errorCheckY floatValue];
NSString * zPoint = [finishedParsingArray objectAtIndex:baseIndex+2];
NSDecimalNumber * errorCheckZ = [NSDecimalNumber decimalNumberWithString:zPoint];
float z = [errorCheckZ floatValue];
vertex3D = [[Vertex3D alloc]init];
vertex3D.value1 = x;
vertex3D.value2 = y;
vertex3D.value3 = z;
[verticesArray addObject:vertex3D];
//NSLog(@"Vertices stored are %f, %f, %f", x,y,z);
}
currentlyParsing = kNilSetting;
checkSumCount = 0;
[finishedParsingArray removeAllObjects];
//Set object to adds vertice array to verticesArray;
vertex3D = nil;
objectToAdd.Vertices = verticesArray;
[verticesArray removeAllObjects];
//[finishedArray release];
culmunativeCount = 0;
[fullParseString setString:@""];
}
}
}
}
Vertex3D - это пользовательский класс для хранения точек x, y, z:
#import <Foundation/Foundation.h>
@interface Vertex3D : NSObject
{
float value1;
float value2;
float value3;
}
@property (assign) float value1;
@property (assign) float value2;
@property (assign) float value3;
@end
Затем я передаю этот массив в класс SceneObject, который создается для каждого объекта в файле.Идея заключается в том, чтобы использовать эти объекты SceneObject для подачи движка OpenGL ES.Я использую glDrawElements, так как XML-файл использует индексы.
Проблема в том, что я не могу передать массив NSMutable в вызовы OpenGL ES (например, glVertexPointer).
Из примера, которому я следовал в http://www.everita.com/lightwave-collada-and-opengles-on-the-iphone,, похоже, мне нужно структурировать данные вершин следующим образом, чтобы использовать индексы:
const Vertex3D tigerBottomPositions[] = {
{0.176567, 0.143711, 0.264963},
{0.176567, 0.137939, 0.177312},
{0.198811, 0.135518, 0.179324},
…
};
Это гдеЯ немного запутался - я думаю, что это массив структур C, который содержит 3 объекта Vertex3D, каждый из которых содержит три числа с плавающей точкой.правильный формат для использования с OpenGL ES?Я также был бы признателен за помощь в настройке этой структуры C в коде, поскольку мои знания C не так сильны, как мой объект c.
Заранее спасибо!