如何解决SceneKit double不支持的错误?

在过去的几天里,我一直在寻找适用于iOS的SceneKit。 我在尝试创建自定义几何时遇到了一个问题。 每当我试图显示几何图形时,它都不会绘制,并在运行时显示此错误。

SceneKit:错误,C3DRendererContextSetupResidentMeshSourceAtLocation – 不支持double

我创建了一个针对iOS的游乐场,以测试更简单的自定义几何示例,并使用swift vs objective c查看有关自定义几何的问题 。

我尝试使用目标c的另一个项目,仍然收到相同的错误消息。

在操场或完整项目上定位桌面时,不会出现错误,并且几何体正确绘制。 仅在定位iOS时才会出现错误消息。

import SceneKit import QuartzCore // for the basic animation import XCPlayground // for the live preview // create a scene view with an empty scene var sceneView = SCNView(frame: CGRect(x: 0, y: 0, width: 300, height: 300)) var scene = SCNScene() sceneView.scene = scene // start a live preview of that view XCPShowView("The Scene View", sceneView) // default lighting sceneView.autoenablesDefaultLighting = true // a camera var camera = SCNCamera() var cameraNode = SCNNode() cameraNode.camera = camera cameraNode.position = SCNVector3(x: 0, y: 0, z: 10) scene.rootNode.addChildNode(cameraNode) // create geometry var verts = [SCNVector3(x: 0,y: 0,z: 0),SCNVector3(x: 1,y: 0,z: 0),SCNVector3(x: 0,y: 1,z: 0)] let src = SCNGeometrySource(vertices: &verts, count: 3) let indexes: [CInt] = [0, 1, 2] let dat = NSData( bytes: indexes, length: sizeof(CInt) * countElements(indexes) ) let ele = SCNGeometryElement( data: dat, primitiveType: .Triangles, primitiveCount: 1, bytesPerIndex: sizeof(CInt) ) let geo = SCNGeometry(sources: [src], elements: [ele]) let nd = SCNNode(geometry: geo) scene.rootNode.addChildNode(nd) 

这是我在操场上用来绘制三角形的代码。 定位桌面时使用相同的代码。

如何修复此问题并显示iOS的几何图形?

我的猜测是SCNVector3是根据桌面的CGFloat (可能是32位或64位,取决于主机)和Float for iOS设备 – iOS模拟器平台(这是你瞄准iOS时得到的)来定义的。在操场上)既不像设备也不像OS X. 向Apple提交一个错误是一个好主意。

与此同时,一个好的解决方法可能是使用更详细的初始化程序(以init(data:semantic:... )开头来创建几何源。

我通过改变创建几何源的方式来解决错误。

通过遵循此问题创建几何源的方法,错误得到修复,三角形正确绘制。

我相信解决方案是在使用

 + (instancetype)geometrySourceWithData:(NSData *)data semantic:(NSString *)semantic vectorCount:(NSInteger)vectorCount floatComponents:(BOOL)floatComponents componentsPerVector:(NSInteger)componentsPerVector bytesPerComponent:(NSInteger)bytesPerComponent dataOffset:(NSInteger)offset dataStride:(NSInteger)stride 

代替

 + (instancetype)geometrySourceWithVertices:(const SCNVector3 *)vertices count:(NSInteger)count 

因为它指定我使用float组件而不是double。

更确切地说,让它对我有用的是:

 struct FloatPoint { var x: Float var y: Float } let textCoords = [FloatPoint]() ... fill it let textureData = NSData(bytes: textCoords, length: textCoords.count * sizeof(FloatPoint.self)) let textSource = SCNGeometrySource( data: textureData as Data, semantic: SCNGeometrySourceSemanticTexcoord, vectorCount: textCoords.count, floatComponents: true, componentsPerVector: 2, bytesPerComponent: sizeof(Float.self), dataOffset: 0, dataStride: sizeof(FloatPoint.self) ) 

我也填了一个苹果