如何获得虚拟平面的4个顶点坐标?

时间:2018-04-12 07:56:06

标签: swift arkit

我通过Scenekit基于真实表创建了虚拟平面(SCNPlane)。另外,我想知道虚拟平面的4个顶点的坐标。

Click here to see image.

2 个答案:

答案 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)
    """)

 }