目标是增加scnbox的长度,使其仅在正Z方向上生长。
这个答案建议使用pivot
属性。
但是, pivot
属性的文档在scnnode页面上很少,而scnbox页面上没有任何文档。
有人可以解释pivot
属性的工作方式吗?
更改节点的pivot
与插入该节点与其父之间的中间节点相同。这在不同的情况下可能很有用。一个例子是,当节点几何形状的中心不是您所期望的。
例如,如果您有SCNBox
,则是边界框
- 最低:
(-0.5 * width, -0.5 * height, -0.5 * length)
- max:
(+0.5 * width, +0.5 * height, +0.5 * length)
- 中心:
(0.0, 0.0, 0.0)
如果您希望SCNBox
的length
仅在正Z轴上增加,那么您想要的是
- 最低:
(-0.5 * width, -0.5 * height, 0.0)
- 最大:
(+0.5 * width, +0.5 * height, length)
- 中心:
(0.0, 0.0, +0.5 * length)
几何框的边界永远不会改变,但是有一些方法可以安排节点和更改它们的边界框。
解决方案1:中间节点
处理转换时的一个常见解决方案是使用中间节点来更好地了解如何应用转换。
在您的情况下,您需要从
更改节点层次结构- parentNode
| - node
| * geometry
| * transform = SCNMatrix4MakeScale(...)
to
- parentNode
| - intermediateNode
| * transform = SCNMatrix4MakeScale(...)
| | - node
| | * geometry
| | * transform = SCNMatrix4MakeTranslation(0, 0, +0.5 * length)
使用这个新的层次结构,node
的边界框的中心仍然是(0.0, 0.0, 0.0)
,但是intermediateNode
的边界框的中心为(0.0, 0.0, +0.5 * length)
。
通过缩放intermediateNode
而不是node
,您将获得所需的结果。
解决方案2:Pivot
事实证明,这正是pivot
属性所做的:
node.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5 * length);
一旦您在精神上找出了中间节点的变换,只需将其逆设置为pivot
属性。
您可以在此处找到有关pivot
属性的更多信息:https://developer.apple.com/Reference/Reference/scenekit/scnnode/1408044-pivot
这与CALayer
上的Core Animation的anchorPoint
属性非常相似,除了在核心动画中,锚点指定为相对于层的边界框(从0
到CC_25),为层的宽度和高度的百分比)在场景中,这是绝对的。
说您有一个像这样创建的盒子:
SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)
枢轴点将位于该框的中央,您现在想将其移至其中一个边缘。这可以通过将枢轴节点转换为0.5来完成。(这是盒子宽度的一半或中心和边缘之间的距离。)
boxNode.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5)
枢轴点现在将位于对象的中心X,中心Y和零Z。如果您现在缩放盒子,它只会沿正Z方向生长。
听起来好像要增加scnbox的长度(几何形状)。因此,您可以简单地增加长度属性。您提到的答案是关于pivot
属性的。如您从文档中看到的:
节点位置,旋转和比例的枢轴点。
例如,通过将枢轴设置为翻译转换,您可以将包含球几何形状的节点定位到球体将在地板上而不是相对于其中心的位置放置。