我有一个基于OpenGL ES的应用程序,它使用NSXMLParser解析xml文件中的信息。由于顶点信息都在该文件中的每个场景的对象,我在一个NSMutableArray如下保存它:将NSMutableArray转换为C结构数组 - iPhone - OpenGL ES
- (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},
…
};
这是我有点困惑 - 我想这是一个包含3个Vertex3D对象的C结构数组,每个对象包含三个浮点数。
任何人都可以告诉我如何可以将我的NSMutableArray转换为正确格式的C结构以用于OpenGL ES?我也很感谢如何在代码中设置这个C结构的帮助,因为我的C知识不如我的对象那么强大。
预先感谢您!
** ** Vertex3D您在使用**常量Vertex3D tigerBottomPositions [] **能与您定义的类** Vertex3D **不一样。 – sch 2012-02-16 21:10:28