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

如何获取基于真实桌面创建的SCNPlane虚拟平面的四个顶点坐标?

嘿,我来帮你搞定这个问题!要获取你基于真实桌面创建的SCNPlane的四个顶点坐标,关键在于把平面的局部坐标顶点转换成世界坐标(因为你的平面节点肯定带有对应真实桌面的位置、旋转等变换)。下面是具体步骤和代码示例:

获取SCNPlane四个顶点坐标的步骤

1. 确定SCNPlane的局部顶点

SCNPlane的默认几何是以节点原点为中心,平铺在XY平面上的(Z轴坐标为0)。假设你的平面节点是planeNode,平面的尺寸是width和height,那么它的四个局部顶点坐标是:

  • 左上角: (-width/2, height/2, 0)
  • 右上角: (width/2, height/2, 0)
  • 右下角: (width/2, -height/2, 0)
  • 左下角: (-width/2, -height/2, 0)

2. 将局部坐标转换为世界坐标

因为你的平面节点已经被放置到对应真实桌面的位置(带有平移、旋转等变换),所以需要把局部坐标转换成世界空间的坐标。可以用SceneKit节点的convertPosition(_:to:)方法,传入nil表示转换到世界空间:

Swift代码示例

// 假设你的平面节点是planeNode
guard let plane = planeNode.geometry as? SCNPlane else {
    print("目标节点的几何不是SCNPlane类型")
    return
}

let width = plane.width
let height = plane.height

// 定义局部顶点数组
let localVertices: [SCNVector3] = [
    SCNVector3(-width/2, height/2, 0),    // 左上顶点
    SCNVector3(width/2, height/2, 0),     // 右上顶点
    SCNVector3(width/2, -height/2, 0),    // 右下顶点
    SCNVector3(-width/2, -height/2, 0)    // 左下顶点
]

// 转换为世界坐标
let worldVertices = localVertices.map { vertex in
    planeNode.convertPosition(vertex, to: nil)
}

// 输出转换后的顶点坐标
for (index, vertex) in worldVertices.enumerated() {
    print("顶点\(index+1): X=\(vertex.x), Y=\(vertex.y), Z=\(vertex.z)")
}

额外说明

  • 如果你的平面是通过ARKit的ARPlaneAnchor创建的,也可以直接从锚点的center和extent计算世界顶点,但上面的方法依然通用——因为锚点对应的SCNNode同样可以用convertPosition完成坐标转换。
  • 如果你需要的是相对于某个父节点的坐标,只需要把convertPosition的第二个参数换成对应的父节点即可,不用传nil。

内容的提问来源于stack exchange,提问作者Se-eun Park

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:29:40