NSXMLParserを使用してxmlファイルの情報を解析するOpenGL ESベースのアプリケーションがあります。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
を頂点情報は、ファイル内の各シーンのオブジェクトのために来ると、以下のように、私はNSMutableArrayの中でそれを保存しています
私がしているのは、この配列をファイル内のすべてのオブジェクトに対してインスタンス化されたSceneObjectクラスに渡すことです。この考え方は、これらのSceneObjectオブジェクトをOpenGL ESエンジンに供給することです。私はインデックスを使用するxmlファイルとしてglDrawElementsを使用しています。
問題は、OpenGL ES呼び出し(glVertexPointerなど)にNSMutable配列を渡すことができないことです。私は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構造体の配列で、それぞれ3つの浮動小数点数を含みます。
NSMutableArrayをOpenGL ESで使用するための正しい形式のC構造体に変換する方法については、誰でも助言できますか?私はCの知識が私のobj cほど強くないので、コードでこのC構造体をセットアップする方法についても助けていただきたいと思います。
ありがとうございます!
** Vertex3D **あなたは** constのVertex3D tigerBottomPositions [] **缶を使用中あなたが定義したクラス** Vertex3D **と同じではありません。 – sch