总是循环 return 最后一张图片

Loop always return the last image

我试图通过循环在每个几何体上添加不同的 scnMaterial(UIImage),但循环不起作用。循环总是 return 最后一张图片。所以我总是在每个几何体上看到相同的最后一张图像。

  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)
            }
        }
    }

这是我得到的结果:

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 从图像 5 初始化(如果存在)。

根据您的评论:

I just want 6 geometry with six different material

并假设你是

  1. 在嵌套的 for 循环和
  2. 中渲染 6 个不同尺寸的几何图形
  3. 在您的应用程序包中有六张名为 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)
        }
    }
}

您需要一些逻辑 并将其转化为代码,才能将material 应用于几何图形。如果您没有 rule/logic,那么您可以随机申请。