如何解决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) )
我也填了一个苹果
- Alamofire清除所有的cookies
- SWIFT:错误“线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)”是什么意思?
- 如何在Objective-C / iOS中创build一个精确的计时器事件?
- types'string'不符合协议'SequenceType' – Swift 2.0
- iOS中的Speech to Text示例
- 如何在iOS Swift 3中以编程方式推送和呈现给UIViewController而不使用segue
- 截断文本的多行NSAttributedString
- 如何添加NSMutableArray作为objectAtIndex NSMutableArray
- Autolayout以编程方式不起作用