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

时间:2014-11-12 15:36:54

标签: ios swift scenekit

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

SceneKit:错误,C3DRendererContextSetupResidentMeshSourceAtLocation - 不支持double

我创建了一个以iOS为目标的游乐场,以测试更简单的自定义几何示例,并使用swift vs objective c查看有关自定义几何的this question

我尝试使用目标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的几何图形?

2 个答案:

答案 0 :(得分:6)

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

通过遵循创建几何源的this question's方法,错误得到修复,三角形正确绘制。

我认为解决方案是使用

+ (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。

答案 1 :(得分:2)

根据桌面的SCNVector3(可能是32位或64位,具体取决于主机)和CGFloat适用于iOS设备Float,我的猜测会出现问题 - iOS模拟器平台(这是你在游乐场中定位iOS时得到的)既不像设备也不像OS X. Filing a bug with Apple会是一个好主意。

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