我通过Scenekit基于真实表创建了虚拟平面(SCNPlane)。另外,我想知道虚拟平面的4个顶点的坐标。
答案 0 :(得分:4)
您可以像BlackMirrorz所说的那样获得边界框的坐标。
let (min, max) = planeNode.boundingBox
这将为您提供与SCNVector3对象相对的角(最小和最大)。这些坐标将<相对>相对于对象,不旋转,不平移和不缩放。推导2d平面中的其他两个角坐标。不用担心Z轴。 SCNPlane本质上是2D对象。
let bottomLeft = SCNVector3(min.x, min.y, 0)
let topRight = SCNVector3(max.x, max.y, 0)
let topLeft = SCNVector3(min.x, max.y, 0)
let bottomRight = SCNVector3(max.x, min.y, 0)
然后打电话
let worldBottomLeft = planeNode.convertPosition(bottomLeft, to: rootNode)
let worldTopRight = planeNode.convertPosition(topRight, to: rootNode)
let worldTopLeft = planeNode.convertPosition(topLeft, to: rootNode)
let worldBottomRight = planeNode.convertPosition(bottomRight, to: rootNode)
将每个坐标转换为世界空间。系统将为您进行旋转,平移和缩放。
答案 1 :(得分:0)
SCNNode具有boundingBox
属性,该属性引用:
对象边界框的最小和最大角点。
var boundingBox: (min: SCNVector3, max: SCNVector3) { get set }
因此:
Scene Kit使用定义局部坐标空间中的边界框 识别其角落的两个点,隐含地确定六个角 轴对齐的平面标志着它的极限。例如,如果是几何体 边界框具有最小角{-1,0,2}和最大角 {3,4,5},几何体顶点数据中的所有点都有一个 x坐标值介于-1.0和3.0之间(含)。该坐标 读取此属性时提供的仅在对象具有的情况下才有效 要测量的体积。对于不包含顶点数据或a的几何体 如果节点不包含几何,则min和max都为零。
因此很容易得到SCNNode
的坐标:
/// Returns The Size Of An SCNode
///
/// - Parameter node: SCNNode
func getSizeOfModel(_ node: SCNNode){
//1. Get The Bouding Box Of The Node
let (min, max) = node.boundingBox
//2. Get It's Z Coordinate
let zPosition = node.position.z
//3. Get The Width & Height Of The Node
let widthOfNode = max.x - min.x
let heightOfNode = max.y - min.y
//4. Get The Corners Of The Node
let topLeftCorner = SCNVector3(min.x, max.y, zPosition)
let bottomLeftCorner = SCNVector3(min.x, min.y, zPosition)
let topRightCorner = SCNVector3(max.x, max.y, zPosition)
let bottomRightCorner = SCNVector3(max.x, min.y, zPosition)
print("""
Width Of Node = \(widthOfNode)
Height Of Node = \(heightOfNode)
Bottom Left Coordinates = \(bottomLeftCorner)
Top Left Coordinates = \(topLeftCorner)
Bottom Right Coordinates = \(bottomRightCorner)
Top Right Coordinates = \(topRightCorner)
""")
}