使用macOS在SceneKit中显示stl文件时出现问题

使用macOS在SceneKit中显示stl文件时出现问题,macos,scenekit,Macos,Scenekit,我有一个二进制stl文件,它可以在ios scenekit中显示,但不能用相同的代码在macOs中显示。当我加载文件时,有时应用程序崩溃,有时它显示错误的东西 macOs 10.14.6 -(SCNNode*)loadBinarySTLWithData:(NSData*)数据{ NSMutableData*顶点=[NSMutableData]; NSMutableData*法线=[NSMutableData]; NSMutableData*元素=[NSMutableData]; 如果(数据长度

我有一个二进制stl文件,它可以在ios scenekit中显示,但不能用相同的代码在macOs中显示。当我加载文件时,有时应用程序崩溃,有时它显示错误的东西

macOs 10.14.6


-(SCNNode*)loadBinarySTLWithData:(NSData*)数据{
NSMutableData*顶点=[NSMutableData];
NSMutableData*法线=[NSMutableData];
NSMutableData*元素=[NSMutableData];
如果(数据长度%50!=0){
返回零;
}
NSInteger allCount=data.length/50;
for(int i=0;ifor(int j=1;j
SCInvector3
在iOS和macOS上有不同的声明:

//iOS
typedef结构转换程序3{
浮动x,y,z;
}SCInvector3;
//macOS
typedef结构转换程序3{
cgx,y,z;
}SCInvector3;
当编译64位时,
CGFloat
double
。 这意味着
sizeof(scinvector3)
在macOS上不是正确的步幅。您应该使用
3*sizeof(float)

- (SCNNode *)loadBinarySTLWithData:(NSData *)data{

NSMutableData *vertices = [NSMutableData data];
NSMutableData *normals = [NSMutableData data];
NSMutableData *elements = [NSMutableData data];
if (data.length % 50 != 0){
    return nil;
}
NSInteger allCount = data.length/50;
for (int i = 0; i < allCount; i ++){
    for (int j = 1; j <= 3; j ++){
        [normals appendData:[data subdataWithRange:NSMakeRange(i * 50, 12)]];
        [vertices appendData:[data subdataWithRange:NSMakeRange(i * 50 + j*12, 12)]];
    }
    int element[3] = {(int)i * 3,(int)i*3 + 1,(int)i*3 + 2};
    [elements appendBytes:&element[0] length:sizeof(element)];
}
SCNGeometrySource *verticesSource = [SCNGeometrySource geometrySourceWithData:vertices semantic:SCNGeometrySourceSemanticVertex vectorCount:allCount*3 floatComponents:YES componentsPerVector:3 bytesPerComponent:sizeof(float) dataOffset:0 dataStride:sizeof(SCNVector3)];
SCNGeometrySource *normalsSource = [SCNGeometrySource geometrySourceWithData:normals semantic:SCNGeometrySourceSemanticNormal vectorCount:allCount*3 floatComponents:YES componentsPerVector:3 bytesPerComponent:sizeof(float) dataOffset:0 dataStride:sizeof(SCNVector3)];
SCNGeometryElement *geoMetryElement = [SCNGeometryElement geometryElementWithData:elements primitiveType:SCNGeometryPrimitiveTypeTriangles primitiveCount:allCount bytesPerIndex:sizeof(int)];
SCNGeometry *geometry = [SCNGeometry geometryWithSources:@[verticesSource,normalsSource] elements:@[geoMetryElement]];
geometry.firstMaterial.diffuse.contents = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];
geometry.firstMaterial.doubleSided = YES;
SCNNode *node = [SCNNode nodeWithGeometry:geometry];
return node;