总是循环 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
并假设你是
- 在嵌套的 for 循环和
中渲染 6 个不同尺寸的几何图形
- 在您的应用程序包中有六张名为 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,那么您可以随机申请。
我试图通过循环在每个几何体上添加不同的 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
并假设你是
- 在嵌套的 for 循环和 中渲染 6 个不同尺寸的几何图形
- 在您的应用程序包中有六张名为 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,那么您可以随机申请。