2016-12-26 74 views
0

我試圖用循環在每個幾何圖形上添加一個不同的scnMaterial(UIImage),但循環不起作用。循環總是返回最後一個圖像。所以我總是看到每個幾何圖形上的最後一張圖像。循環總是返回最後一個圖像

class GameScene: SCNScene { 

    var geometry = SCNBox() 
    var boxnode = SCNNode() 

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

     let offset: Int = 10 
     var matCounter:Int = 1 
     for xIndex:Int in 0...1 { 
      for yIndex:Int in 0...1 { 
       // create a geometry copy 
       let geometry = SCNBox(width: 0.8 , height: 0.8, length: 0.1, chamferRadius: 0.005) 
       let geometry1 = SCNBox(width:2 , height: 2, length: 0.1, chamferRadius: 0.005) 

       let img = UIImage(named:"\(matCounter).png") 
       let material = SCNMaterial() 
       material.diffuse.contents = img 
       geometry1.firstMaterial = material 
       geometry1.firstMaterial = material 
       matCounter = matCounter + 1 

       let boxnode = SCNNode(geometry: geometry) 
       boxnode.position.x = Float(xIndex - offset) 
       boxnode.position.y = Float(yIndex - offset) 

       let geometry1Node = SCNNode(geometry: geometry1) 
       geometry1Node.position.x = Float(xIndex - 20) 
       geometry1Node.position.y = Float(yIndex - 20) 

       self.rootNode.addChildNode(boxnode) 
       self.rootNode.addChildNode(geometry1Node) 
      } 
     } 
    } 

下面是我得到的結果:從圖片5初始化,如果它存在

enter image description here

+0

哪條線你正在返回一些東西? – Honey

+0

'geoCopy.firstMaterial = material'這行總是覆蓋'firstMaterial'屬性。只有最後一組值纔會持續。 – Alexander

+0

請更新您的問題,解釋您如何決定應用哪種材質的幾何圖形。我在這裏猜測:應該在網格中的每個'n'節點上應用名爲'<> .png'的材料嗎? –

回答

1

基於您的評論:

我只想6幾何與六種不同的材料

,並假設你是

  1. 渲染6件的幾何形狀,不同尺寸,內你的嵌套for循環和
  2. 有六個圖像名爲1.png到6.png在你的應用程序包;

你可以這樣做:

override init() 
{ 
    super.init() 

    typealias BoxDims = (width: CGFloat, height: CGFloat, 
         length: CGFloat, chamferRadius: CGFloat) 

    let box1Dim = BoxDims(CGFloat(0.8), CGFloat(0.8), CGFloat(0.10), CGFloat(0.005)) 
    let box2Dim = BoxDims(CGFloat(0.7), CGFloat(0.7), CGFloat(0.15), CGFloat(0.006)) 
    let box3Dim = BoxDims(CGFloat(0.9), CGFloat(0.6), CGFloat(0.12), CGFloat(0.007)) 
    let box4Dim = BoxDims(CGFloat(1.2), CGFloat(0.9), CGFloat(0.18), CGFloat(0.003)) 
    let box5Dim = BoxDims(CGFloat(1.0), CGFloat(1.0), CGFloat(0.11), CGFloat(0.008)) 
    let box6Dim = BoxDims(CGFloat(1.1), CGFloat(1.1), CGFloat(0.16), CGFloat(0.009)) 

    let allBoxDims = [box1Dim, box2Dim, box3Dim, box4Dim, box5Dim, box6Dim] 

    let offset: Int = 10 
    var boxCounter: Int = 0 
    for xIndex: Int in 0...2 
    { 
     for yIndex: Int in 0...1 
     { 
      // create a geometry 
      let boxDim = allBoxDims[boxCounter] 
      let geo = SCNBox(width: boxDim.width, height: boxDim.height, 
          length: boxDim.length, 
          chamferRadius: boxDim.chamferRadius) 

      let img = UIImage(named: "\(boxCounter + 1).png") 
      let material = SCNMaterial() 
      material.diffuse.contents = img 
      geo.firstMaterial = material 
      boxCounter = boxCounter + 1 

      let boxNode = SCNNode(geometry: geo) 
      boxNode.position.x = Float(xIndex - offset) 
      boxNode.position.y = Float(yIndex - offset) 
      self.rootNode.addChildNode(boxNode) 
     } 
    } 
} 

你需要有您轉換成代碼,應用材質到幾何一些邏輯。如果你沒有任何規則/邏輯,那麼你可以隨機應用。

+0

再次感謝@dmsurti,如果我希望每個幾何體具有不同的尺寸,是否可以使用副本完成?謝謝 – John

+0

假設你只是想使用相同的幾何體,但是放大了,你可以設置'boxNode.scale = SCNVector3Make(2,2,2)',這將在所有的'x,y,z'軸上加倍幾何尺寸。如果它們是不同的幾何體,則用不同的幾何體對象設置每個節點。 –

+0

第一個建議不起作用,我不完全理解第二個建議(如果你能舉一個例子,我會非常感激它)。我想要一個帶有不同大小的SCNbox的網格(15盒)。我想自己設定尺寸。我從來沒有嘗試過SCNKit,所以對我來說有點難以理解。謝謝 – John

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

    } 
} 

這將永遠離開geoCopy.firstMaterial