如何获取基于真实桌面创建的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
相关产品推荐
相关产品推荐

