在 macOS 的 SceneKit 中无法显示 stl 文件

Posted

技术标签:

【中文标题】在 macOS 的 SceneKit 中无法显示 stl 文件【英文标题】:Trouble displaying stl file in SceneKit with macOS 【发布时间】:2019-12-14 18:48:43 【问题描述】:

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

macOS 10.14.6


- (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;

【问题讨论】:

【参考方案1】:

SCNVector3 在 iOS 和 macOS 上有不同的声明:

// iOS
typedef struct SCNVector3 
    float x, y, z;
 SCNVector3;
// macOS
typedef struct SCNVector3 
    CGFloat x, y, z;
 SCNVector3;

当为 64 位编译时,CGFloatdouble。 这意味着sizeof(SCNVector3) 不是 macOS 上的正确步幅。你应该改用3 * sizeof(float)

【讨论】:

以上是关于在 macOS 的 SceneKit 中无法显示 stl 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SceneKit 中显示金属和透明纹理?

3D 模型无法在 Scenekit 中正确加载

在 SceneKit 中播放视频的最佳方式是啥?

在 SceneKit 节点周围添加边框

无法在 SK3DNode 上方显示精灵

从SceneKit中检测SpriteKit按钮按叠加