mnu*_*ges 12
更改节点pivot在概念上与在此节点与其父节点之间插入中间节点相同.这在不同情况下很有用.一个例子是节点几何中心不在你预期的位置.
例如,如果你有一个SCNBox,它的边界框就是
(-0.5 * width, -0.5 * height, -0.5 * length)(+0.5 * width, +0.5 * height, +0.5 * length)(0.0, 0.0, 0.0)如果你想length的SCNBox仅在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(...)
Run Code Online (Sandbox Code Playgroud)
至
- parentNode
| - intermediateNode
| * transform = SCNMatrix4MakeScale(...)
| | - node
| | * geometry
| | * transform = SCNMatrix4MakeTranslation(0, 0, +0.5 * length)
Run Code Online (Sandbox Code Playgroud)
使用这个新的层次结构,边界框的中心node仍然是(0.0, 0.0, 0.0),但是边界框的中心intermediateNode是(0.0, 0.0, +0.5 * length).
通过缩放intermediateNode而不是node你将获得想要的结果.
解决方案2:透视
事实证明,这正是pivot财产的作用:
node.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5 * length);
Run Code Online (Sandbox Code Playgroud)
一旦您精神上想出了中间节点的变换,只需将其反转设置为pivot属性即可.
您可以在pivot此处找到有关该物业的更多信息:https://developer.apple.com/reference/scenekit/scnnode/1408044-pivot
这是非常相似的核心动画的anchorPoint财产CALayer,所不同的是在核心动画锚点被指定为相对于该层的边界框(从进入0到1作为层的宽度和高度的百分比),而在SceneKit它是绝对的.
假设您有一个这样创建的框:
SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)
Run Code Online (Sandbox Code Playgroud)
枢轴点将位于该框的中心,现在您要将其移至边缘之一。这可以通过将枢轴节点平移0.5来完成。(这是框的宽度或中心与边缘之间的距离的一半。)
boxNode.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5)
Run Code Online (Sandbox Code Playgroud)
现在,枢轴点将位于对象的中心X,中心Y和零Z。如果现在缩放框,则框将仅沿Z轴正方向增长。
| 归档时间: |
|
| 查看次数: |
4374 次 |
| 最近记录: |