SceneKit问题:修改节点缩放后bounding box未自动更新?
解决SceneKit修改节点缩放后包围盒不更新的问题
为什么
modelNode.boundingBox没变化?boundingBox是节点本地空间的包围盒,仅由几何体的原始尺寸决定,和节点的scale、rotation、position等变换完全无关。所以修改节点缩放后,本地包围盒不会跟着改变,这是SceneKit的正常行为,不需要手动设置更新。如何获取世界空间的包围盒?
直接使用节点的worldBoundingBox属性,它会自动计算节点应用所有变换(缩放、旋转、位移)后的世界空间包围盒,代码示例:let worldBox = modelNode.worldBoundingBox let worldSizeX = worldBox.max.x - worldBox.min.x let worldSizeY = worldBox.max.y - worldBox.min.y let worldSizeZ = worldBox.max.z - worldBox.min.z print("世界空间尺寸:\(worldSizeX), \(worldSizeY), \(worldSizeZ)")额外说明:
如果你确实需要修改本地包围盒(一般不推荐,会改变几何体原始数据),可以直接缩放几何体本身,比如:let geometry = modelNode.geometry! let scaleX = targetX/(geometry.boundingBox.max.x - geometry.boundingBox.min.x) let scaleY = targetY/(geometry.boundingBox.max.y - geometry.boundingBox.min.y) let scaleZ = targetZ/(geometry.boundingBox.max.z - geometry.boundingBox.min.z) geometry.scale = SCNVector3(scaleX, scaleY, scaleZ)但这种方式不如调整节点缩放灵活,节点变换可随时修改,而几何体缩放是永久性改变原始数据。
内容的提问来源于stack exchange,提问作者Andy Hin
相关产品推荐
相关产品推荐

