You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:03:12