2015-09-29 65 views
2

問題是如果我使用此構造函數創建SCNGeometryinit(sources: [AnyObject], elements: [AnyObject]?)下面是一個示例(這應該繪製一個立方體,取自此tutorial):對象不是使用三角形和座標的渲染/繪圖,SceneKit

func test() 
{ 
    var cubeSide:Float = 15.0; 
    var halfSide:Float = cubeSide/2; 

    var positions:[SCNVector3] = [ 
     SCNVector3Make(-halfSide, -halfSide, halfSide), 
     SCNVector3Make(halfSide, -halfSide, halfSide), 
     SCNVector3Make(-halfSide, -halfSide, -halfSide), 
     SCNVector3Make(halfSide, -halfSide, -halfSide), 
     SCNVector3Make(-halfSide, halfSide, halfSide), 
     SCNVector3Make(halfSide, halfSide, halfSide), 
     SCNVector3Make(-halfSide, halfSide, -halfSide), 
     SCNVector3Make(halfSide, halfSide, -halfSide) 
    ]; 

    var indices:[Int] = [ 
     0, 2, 1, 
     1, 2, 3, 
     // back 
     2, 6, 3, 
     3, 6, 7, 
     // left 
     0, 4, 2, 
     2, 4, 6, 
     // right 
     1, 3, 5, 
     3, 7, 5, 
     // front 
     0, 1, 4, 
     1, 5, 4, 
     // top 
     4, 5, 6, 
     5, 7, 6 
    ]; 

    var geometrySource = SCNGeometrySource(vertices: positions, count: 8) 

    var data = NSData(bytes: indices, length: sizeof(Int) * indices.count) 

    var element = SCNGeometryElement(data: data, primitiveType: SCNGeometryPrimitiveType.Triangles, primitiveCount: 12, bytesPerIndex: sizeof(Int)) 

    var geometry = SCNGeometry(sources: [geometrySource], elements: [element]) 
    geometry.materials?.first?.diffuse.contents = UIColor.redColor() 

    var node = SCNNode(geometry: geometry) 

    /*var cameraNode:SCNNode = SCNNode() 
    cameraNode.camera = SCNCamera() 
    cameraNode.position = SCNVector3Make(0, 12, 30); 
    self.rootNode.addChildNode(cameraNode);*/ 

    self.rootNode.addChildNode(node) 
} 

但是屏幕就是一句: IPad emulator

如果我創建知名人物的幾何形狀,一切正常。代碼示例:

func showCone() 
{ 
    var radius:CGFloat = 1.0 

    let cone = SCNCone(topRadius: 0.1, bottomRadius: 3, height: 2) 
    cone.firstMaterial?.diffuse.contents = UIColor.redColor() 

    let coneNode = SCNNode(geometry: cone) 
    coneNode.position = SCNVector3(x: 4.0, y: 3.0, z: 20.0) 

    self.rootNode.addChildNode(coneNode) 
} 

如何,它看起來像: IPad emulator

我認爲這個問題是相機節點,但我已經做了很多改變操作並沒有什麼的。更改節點position也沒有幫助。另外,如果我創建一個新的Xcode項目,它的部署目標是OS X,它就可以工作。但是我需要iOS的解決方案。

我的錯誤是什麼,我做錯了什麼?

最初我的問題是我無法從解析的.stl文件中繪製3D模型。我認爲問題是解析,但後來我試圖使用原始類型 - 三角形和他們的位置繪製任何東西,並沒有奏效。

回答

3

SceneKit不處理Int索引,因爲它們的值可能太大。你應該看到這個控制檯:

SceneKit:每個索引錯誤,C3DRendererContextBindMeshElement不支持字節(8)

使用UInt8代替:

var indices:[UInt8] = ... 

還要注意的是,在斯威夫特,有一個幫助器來構建幾何元素。 以下行

var data = NSData(bytes: indices, length: sizeof(Int) * indices.count) 
var element = SCNGeometryElement(data: &data, primitiveType: .Triangles, primitiveCount: 12, bytesPerIndex: sizeofValue(indices[0])) 

成爲

var element = SCNGeometryElement(indices: indices, primitiveType: .Triangles) 
+0

我改變類型UINT8,現在得到了EN錯誤 'C3DRendererContextSetupResidentMeshSourceAtLocation - 雙不支持'。順便說一句,沒有得到關於幫手的答案的第二部分,因爲如果我像你一樣寫,這只是一個編譯錯誤。 – prvit

+0

位置和法線源應該從浮點數組中創建('[Float]')。至於方便的方法,請確保您使用的是最新的工具鏈(Xcode 7.0.1)。 – mnuages

+0

非常感謝你,其實代碼是正確的,但我用Xcode 7.0版,更新後一切正常:) – prvit