几何源
当你打电话给geometrySourcesForSemantic:
你时,你会得到一个具有给定语义的对象数组,SCNGeometrySource
在你的情况下是顶点数据的来源)。
此数据可能已以多种不同方式编码,并且多个源可以使用具有不同stride
和offset
. 源本身有一堆属性供您解码data
,例如
dataStride
dataOffset
vectorCount
componentsPerVector
bytesPerComponent
您可以使用这些组合来确定data
要读取的部分并从中制作顶点。
解码
步幅告诉您应该步进多少字节才能到达下一个向量,偏移量告诉您在到达该向量的相关数据部分之前应该从该向量的开始偏移多少字节。您应该为每个向量读取的字节数是 componentsPerVector * bytesPerComponent
读取单个几何源的所有顶点的代码看起来像这样
// Get the vertex sources
NSArray *vertexSources = [geometry geometrySourcesForSemantic:SCNGeometrySourceSemanticVertex];
// Get the first source
SCNGeometrySource *vertexSource = vertexSources[0]; // TODO: Parse all the sources
NSInteger stride = vertexSource.dataStride; // in bytes
NSInteger offset = vertexSource.dataOffset; // in bytes
NSInteger componentsPerVector = vertexSource.componentsPerVector;
NSInteger bytesPerVector = componentsPerVector * vertexSource.bytesPerComponent;
NSInteger vectorCount = vertexSource.vectorCount;
SCNVector3 vertices[vectorCount]; // A new array for vertices
// for each vector, read the bytes
for (NSInteger i=0; i<vectorCount; i++) {
// Assuming that bytes per component is 4 (a float)
// If it was 8 then it would be a double (aka CGFloat)
float vectorData[componentsPerVector];
// The range of bytes for this vector
NSRange byteRange = NSMakeRange(i*stride + offset, // Start at current stride + offset
bytesPerVector); // and read the lenght of one vector
// Read into the vector data buffer
[vertexSource.data getBytes:&vectorData range:byteRange];
// At this point you can read the data from the float array
float x = vectorData[0];
float y = vectorData[1];
float z = vectorData[2];
// ... Maybe even save it as an SCNVector3 for later use ...
vertices[i] = SCNVector3Make(x, y, z);
// ... or just log it
NSLog(@"x:%f, y:%f, z:%f", x, y, z);
}
几何元素
这将为您提供所有顶点,但不会告诉您如何使用它们来构造几何图形。为此,您需要管理顶点索引的几何元素。
geometryElementCount
您可以从属性中获取一块几何图形的几何元素数量。然后你可以使用geometryElementAtIndex:
.
该元素可以告诉您顶点是使用单个三角形还是三角形条。它还告诉您每个索引的字节数(索引可能是int
s 或short
s ,这对于解码其data
.