SceneKit中如何实现SCNNode绕自身左上角点旋转
SceneKit 实现 SCNNode 绕自身左上角旋转的方法
SceneKit 里的 SCNNode 没有类似 UIView 的 anchorPoint 直接修改锚点的属性,节点默认的旋转、缩放变换都是以自身坐标系原点为基准的,要实现绕自身左上角旋转,有两种非常稳定的实现方案,不需要写每帧实时计算位置的冗余逻辑。
方案1:直接修改节点的 pivot 属性(最简便)
pivot 是节点自带的四维变换矩阵,作用是在节点应用旋转、位移、缩放等主变换之前,先对节点本地坐标系做基准偏移,本质就是用来调整变换锚点的。
实现步骤:
- 先拿到节点在自身坐标系下的包围盒,算出内容的实际宽高
- 给
pivot设置对应平移值,把变换基准点挪到左上角位置即可
示例代码:
// 获取节点自身坐标系下的包围盒范围 let (bboxMin, bboxMax) = targetNode.boundingBox // 计算节点内容的宽、高(如果只做平面旋转z轴偏移不需要处理) let width = bboxMax.x - bboxMin.x let height = bboxMax.y - bboxMin.y // 把旋转基准点从默认的包围盒中心移到左上角 // 注:pivot的平移参数和实际偏移方向是反向的,左移半宽、上移半高对应参数为(width/2, -height/2, 0) targetNode.pivot = SCNMatrix4MakeTranslation(width/2, -height/2, 0)
设置完成后,直接修改 targetNode.rotation 或者 targetNode.eulerAngles,节点就会自动绕自身左上角做旋转,后续缩放操作也会默认以这个点为基准。
注意:如果你的节点是自定义建模导入的,模型本身的原点不在内容中心,只需要根据实际的左上角相对原点的坐标,调整
SCNMatrix4MakeTranslation里的参数即可,核心逻辑是让pivot的平移量刚好把基准点对齐到左上角。
方案2:嵌套空父节点(适合需要保留原节点pivot配置的场景)
如果你不想修改原节点的pivot,避免影响已经写好的其他变换逻辑,可以用节点嵌套的方式实现:
- 新建一个空的
SCNNode作为旋转容器,这个空节点不需要加任何几何体 - 把需要旋转的目标节点作为子节点添加到容器节点下
- 调整目标节点相对于容器的position,让目标节点的左上角刚好对齐容器节点的原点(0,0,0),对应偏移值和方案1里的逻辑一致,中心原点的节点直接设置
targetNode.position = SCNVector3(width/2, -height/2, 0)即可 - 后续所有旋转操作直接作用在空容器节点上即可,因为空节点的旋转中心就是自身原点,刚好对应子节点的左上角位置,旋转效果和方案1完全一致。
内容的提问来源于stack exchange,提问作者macfsr
相关产品推荐
相关产品推荐

