我正在尝试将节点的集合排列到一个网格中,我有三个不同大小的节点,所以我将它们从最大的到最小的排列在一个正方形的网格中。
如果所有节点的大小相同,那么效果很好,因为我有一个整齐的节点网格,所有节点都紧密地包装在一起
[][][]
[][][]
[][][]
问题来了,当新行包含的节点小于前一个节点时,我在行之间获得了额外的空间
[][][]
[][][]
[][][]
我确实希望在行(和列)之间留一个空格,但是我希望能够控制该空格的大小。
我疯了。我看不到代码中会增加此额外空间的任何内容。我知道问题是由于节点大小不同而引起的,但我不知道它是如何发生的。
我认为
没问题我目前正在操场上跑步。
public static func grid(theseObjects: [SCNNode]) -> SCNNode {
let nodesSortedByVolume = theseObjects.sorted(by: {$0.volume > $1.volume } )
let finalNode = SCNNode()
var xOffset: Float = 0.0
var zOffset: Float = 0.0
let gridSize = Int(Double(theseObjects.count).squareRoot().rounded())
for (index, node) in nodesSortedByVolume.enumerated() {
let adjustedIndex = index + 1
node.position = SCNVector3(xOffset, 0.0, zOffset)
finalNode.addChildNode(node)
xOffset += node.width //(node.width + self.spacer)
if (adjustedIndex >= gridSize) && adjustedIndex.isMultiple(of: gridSize) {
zOffset += node.depth
xOffset = 0.0
}
}
return finalNode
}
编辑:我添加了默认的框节点,以消除对我的模型存在问题的任何怀疑,这使查看定位的数学运算更加简单。我添加了打印语句以显示节点的放置位置:
Placing node.name: "large box 1" at node.position.z:0.0, node.position.x:0.0 zOffset: 0.0
node.depth is 2.0
node.name "large box 1" is at finalNode.position.z: 0.0, finalNode.position.x: 0.0
Placing node.name: "large box 2" at node.position.z:0.0, node.position.x:2.0 zOffset: 0.0
node.depth is 2.0
node.name "large box 2" is at finalNode.position.z: 0.0, finalNode.position.x: 2.0
setup new row with zOffset of 2.0
Placing node.name: "small box 1" at node.position.z:2.0, node.position.x:0.0 zOffset: 2.0
node.depth is 1.0
node.name "small box 1" is at finalNode.position.z: 2.0, finalNode.position.x: 0.0
Placing node.name: "small box 2" at node.position.z:2.0, node.position.x:1.0 zOffset: 2.0
node.depth is 1.0
node.name "small box 2" is at finalNode.position.z: 2.0, finalNode.position.x: 1.0
如您所见,小方框被放置在2.0的z位置,这应该不会造成任何间隙,但是当您查看下面的屏幕截图时,会有很大的间隙。
如果我添加更多的大盒子,它们会正确地网格化,直到引入新的大小为止:
答案 0 :(得分:2)