我有一个名为mVerticies的 NSMutableArray 存储为我的类的成员,我想将它们放入一个float数组中,用 glVertexAttribPointer 绘制它们。
通常在绘图时,我会有类似的东西:
float verticies[] = {-1, -1, 1, -1};
// ... prepare to draw
glVertexAttribPointer(GLKVertexAttribPosition,
2, GL_FLOAT, GL_FALSE, 0, verticies);
// ... draw
但是为了使用 glVertexAttribPointer 函数,我需要一个float []。 verticies存储为 NSMutableArray ,因为它们经常更改。有没有一种简单的方法可以将动态float []存储为成员,或者将 NSMutableArray 快速转换为float []?
答案 0 :(得分:8)
假设值存储为NSNumbers,您可以执行以下操作:
float *floatsArray = malloc([numbersArray count] * sizeof(float));
if (floatsArray == NULL) {
// handle error
}
[numbersArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSNumber *number, NSUInteger idx, BOOL *stop) {
floatsArray[idx] = [number floatValue];
}];
// use floatsArray
free(floatsArray);
答案 1 :(得分:2)
如果您只是希望原始块内存直接读取和写入值,则需要使用malloc
。
如果你有一个NSArray array
包含NSNumber实例:
float *vertices = malloc(sizeof(float) * [array count]);
for (int i = 0; i < [array count]; i++) {
vertices[i] = [[array objectAtIndex:i] floatValue];
}
// draw cool 3D objects and stuff
glVertexAttribPointer(....)
// then, when you're totally done with the memory
free(vertices);
与Objective-C对象不同,vertices
指针没有保留计数,因此您需要自己释放它,并跟踪何时可以释放它,因为当您免费调用时它将是马上就走了。
答案 2 :(得分:0)
只需遍历值。假设您的浮动存储为NSNumbers:
NSUInteger count = [mutableVerticesArray count];
float vertices[count];
for (NSUInteger i = 0; i < count; i++) {
vertices[i] = [[mutableVerticesArray objectAtIndex:i] floatValue];
}
// Drawing etc.