在 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 位编译时,CGFloat
是 double
。
这意味着sizeof(SCNVector3)
不是 macOS 上的正确步幅。你应该改用3 * sizeof(float)
。
【讨论】:
以上是关于在 macOS 的 SceneKit 中无法显示 stl 文件的主要内容,如果未能解决你的问题,请参考以下文章