iOS Swift Xcode14中SceneKit绘制图像翻转问题求助
解决方案
无需修改原始点数组,通过节点变换或坐标转换即可实现翻转,以下两种方案任选其一:
方案一:容器节点整体翻转(推荐)
创建一个容器节点承载所有绘制元素,通过翻转容器节点实现整体图像翻转,操作简洁且避免重复修改坐标:
修改viewDidLoad中的绘制逻辑:
if plotPointsArray.count > 0 { // 新增容器节点,用于统一控制所有绘制元素 let containerNode = SCNNode() let pointsNode = SCNNode() // 原绘制球体代码不变 for (index, point) in plotPointsArray.enumerated() { guard point.count == 2 || point.count == 3 else { continue } let spherePosition = SCNVector3( x: Float(point[0]), y: Float(point.count == 2 ? -0.0315 : -point[1]), z: Float(point[point.count - 1]) ) let sphereNode = drawSphere(at: spherePosition, radius: cornerRadius, color: index == 0 ? UIColor.green : UIColor.red) pointsNode.addChildNode(sphereNode) } // 将点节点加入容器 containerNode.addChildNode(pointsNode) // 原绘制线条代码,修改为将线条加入容器 for i in 0..<plotPointsArray.count - 1 { let currentPoint = plotPointsArray[i] let nextPoint = plotPointsArray[i + 1] guard currentPoint.count == nextPoint.count else { continue } let start = SCNVector3(currentPoint[0], currentPoint.count == 2 ? -0.0315 : -currentPoint[1], currentPoint[currentPoint.count - 1]) let end = SCNVector3(nextPoint[0], nextPoint.count == 2 ? -0.0315 : -nextPoint[1], nextPoint[nextPoint.count - 1]) let lineGeometry = SCNGeometry.lineGeometry(from: start, to: end) let lineNode = SCNNode(geometry: lineGeometry) // 加入容器而非根节点 containerNode.addChildNode(lineNode) } // 沿z轴翻转容器,匹配期望输出 containerNode.scale = SCNVector3(1, 1, -1) // 若翻转效果不符,可尝试旋转:containerNode.eulerAngles.z = Float.pi // 将容器加入场景根节点 scene.rootNode.addChildNode(containerNode) }
方案二:直接调整坐标转换
在构建SCNVector3时翻转z轴坐标,无需新增节点:
修改球体和线条的坐标计算部分:
// 球体位置修改 let spherePosition = SCNVector3( x: Float(point[0]), y: Float(point.count == 2 ? -0.0315 : -point[1]), z: Float(-point[point.count - 1]) // 翻转z轴 ) // 线条起点终点修改 let start = SCNVector3(currentPoint[0], currentPoint.count == 2 ? -0.0315 : -currentPoint[1], -currentPoint[currentPoint.count - 1]) let end = SCNVector3(nextPoint[0], nextPoint.count == 2 ? -0.0315 : -nextPoint[1], -nextPoint[nextPoint.count - 1])
两种方案均不会修改原始点数组,且能保证图像不会移出屏幕,根据你的期望输出,沿z轴翻转即可匹配目标效果。
内容的提问来源于stack exchange,提问作者JESTIN SAJI
相关产品推荐
相关产品推荐

