无法将SceneKit节点排列到网格中

时间:2019-06-05 14:18:34

标签: swift scenekit

我正在尝试将节点的集合排列到一个网格中,我有三个不同大小的节点,所以我将它们从最大的到最小的排列在一个正方形的网格中。

如果所有节点的大小相同,那么效果很好,因为我有一个整齐的节点网格,所有节点都紧密地包装在一起

[][][]
[][][]
[][][]

问题来了,当新行包含的节点小于前一个节点时,我在行之间获得了额外的空间

[][][]
[][][]

[][][]

我确实希望在行(和列)之间留一个空格,但是我希望能够控制该空格的大小。

我疯了。我看不到代码中会增加此额外空间的任何内容。我知道问题是由于节点大小不同而引起的,但我不知道它是如何发生的。

我认为

没问题

我目前正在操场上跑步。

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位置,这应该不会造成任何间隙,但是当您查看下面的屏幕截图时,会有很大的间隙。

Image of the output with a gap

如果我添加更多的大盒子,它们会正确地网格化,直到引入新的大小为止:

Boxes of the same type grid correctly, until a new size is introduced

1 个答案:

答案 0 :(得分:2)

感谢打印值。
创建SCNNode时,几何图形围绕枢轴点居中。因此,如果您有一个尺寸为200 x 200 x 200单位的几何立方体,则边界框将从(-100,-100,-100)变为(100,100,100)。

在循环中,当您要更改行时,添加200个单位。
实际上,您必须添加一半(100个单元)和一半的下一个SNNode(50个单元)。

这里有两个图片要说明:

结果与您的实际代码

Result with your actual code

您添加了200个单位,但必须仅添加第一行网格的一半高度(100单位)和第二行网格的一半高度(50单位)。

enter image description here

希望这项帮助! 就像@James P提到的那样,更容易更改枢轴点...

对不起,我的英语不好。