2016-12-21 100 views
3

如何使用3d對象(box)製作網格。我已經知道如何設置scanscene以及如何創建一個對象。但我不知道如何進行佈局。網格應該看起來像這樣,3D空間中有3d對象。如何在scenekit中創建3D網格

這裏是我的嘗試:

  convenience init(create: Bool) { 
     self.init() 

     let geometry = SCNBox(width: 0.8 , height: 0.8, 
           length: 0.1, chamferRadius: 0.005) 
     geometry.firstMaterial?.diffuse.contents = UIColor.red 
     geometry.firstMaterial?.specular.contents = UIColor.white 
     geometry.firstMaterial?.emission.contents = UIColor.blue 
     let offset: Int = 10 

     for xIndex:Int in 0...2 { 
      for yIndex:Int in 0...2 { 
       // create a geometry copy 
       let geoCopy = geometry.copy() as! SCNGeometry 

       var images:[UIImage]=[] 
       for i in 1...5 { 
        if let img = UIImage(named: "\(i)"){ 
         images.append(img) 
         let material = SCNMaterial() 
         material.diffuse.contents = img 
         geoCopy.firstMaterial = material 

        } 
       } 

       let boxnode = SCNNode(geometry: geoCopy) 
       let boxCopy = boxnode.copy() as! SCNNode 
       boxCopy.position.x = Float(xIndex - offset) 
       boxCopy.position.y = Float(yIndex - offset) 
       self.rootNode.addChildNode(boxCopy) 
      } 
     } 
    } 

但我只看到一個框。

謝謝!

我的圖片的圖片:

enter image description here

回答

2

您需要創建一個幾何體,一個盒子節點,然後copy即boxNode。當你有孩子的節點時使用克隆,當你想合併節點上的整個子樹的幾何/材質時,使用flattenedClone。在你的情況下,複製就足夠了。只需更改複製節點的位置即可。

GameScene

import Foundation 
import SceneKit 

class GameScene: SCNScene { 

    override init() { 
     super.init() 

     let geometry = SCNBox(width: 0.6 , height: 0.6, 
           length: 0.1, chamferRadius: 0.005) 
     geometry.firstMaterial?.diffuse.contents = UIColor.red 
     geometry.firstMaterial?.specular.contents = UIColor.white 
     geometry.firstMaterial?.emission.contents = UIColor.blue 
     let boxnode = SCNNode(geometry: geometry) 
     let offset: Int = 16 

     for xIndex:Int in 0...32 { 
      for yIndex:Int in 0...32 { 
       let boxCopy = boxnode.copy() as! SCNNode 
       boxCopy.position.x = Float(xIndex - offset) 
       boxCopy.position.y = Float(yIndex - offset) 
       self.rootNode.addChildNode(boxCopy) 
      } 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
} 

在您的視圖控制器,viewDidLoad中:

override func viewDidLoad() { 
     super.viewDidLoad() 

     // create a new scene 
     let scene = GameScene() 

     // retrieve the SCNView 
     let scnView = self.view as! SCNView 

     // set the scene to the view 
     scnView.scene = scene 
     scnView.pointOfView?.position = SCNVector3Make(0, 0, 100) 

     // allows the user to manipulate the camera 
     scnView.allowsCameraControl = true 

     // show statistics such as fps and timing information 
     scnView.showsStatistics = true 

     // configure the view 
     scnView.backgroundColor = UIColor.white 

    } 

注意,我剛纔推的鏡頭上看放回+ Z軸有一個更好地查看您的網格。

網格截圖

enter image description here


編輯:對於每個幾何

如果你想一個新的材質指定給每個幾何圖形,您需要創建新材料幾何體的副本並將新材料分配給該幾何體副本。請參閱下面的代碼,從7個名爲1.png的圖像到8.png的一組圖像中爲每個diffuse屬性隨機分配一個UIImage。

import Foundation 
import SceneKit 

class GameScene: SCNScene { 

    override init() { 
     super.init() 

     let geometry = SCNBox(width: 6 , height: 6, 
           length: 6, chamferRadius: 0.5) 

     for xIndex:Int in stride(from: 0, to: 32, by:8) { 
      for yIndex:Int in stride(from: 0, to: 32, by: 8) { 
       // create a geometry copy 
       let geoCopy = geometry.copy() as! SCNGeometry 

       // create a random material 
       let r = arc4random_uniform(7) + 1 
       let img = UIImage(named: "\(r).png") 
       let mat = SCNMaterial() 
       mat.diffuse.contents = img 
       geoCopy.firstMaterial = mat 

       // create a copy node with new material and geo copy 
       let boxnode = SCNNode(geometry: geoCopy) 
       let boxCopy = boxnode.copy() as! SCNNode 
       boxCopy.position.x = Float(xIndex - offset) 
       boxCopy.position.y = Float(yIndex - offset) 
       self.rootNode.addChildNode(boxCopy) 
      } 
     } 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
} 

截圖

enter image description here

+0

謝謝!但我有最後一個問題。我試圖在每個幾何體上添加一個SCNMaterial(),我該怎麼做?每個節點的材質都不同,我只有15個節點。謝謝。我剛剛更新了我的問題。 – John

+0

@John更新了答案,以便每個節點具有不同的材質。 –

+0

謝謝,真的很感激。但我怎麼能用圖像來做到這一點。剛剛更新了我的答案。 – John

0

你需要把語句 - 讓boxnode = SCNNode(幾何:self.geometry) - 內循環。如果您希望使用相同的材​​料,則可以對所有節點使用相同的幾何圖形(只需將幾何圖形存儲在變量中並指定它)。否則,如果您希望使用不同的材料,請每次複製幾何體並分配不同的材料。

+0

感謝@Karl Sigiscar,我剛剛更新了我的問題。但它不起作用。我仍然只看到一個盒子。你可以幫我嗎? – John

+1

您還需要在循環內移動代碼的addChildNode部分。迭代期間創建的每個新節點都必須添加到場景中。 –