获取dae节点的大小

时间:2015-02-05 05:49:03

标签: scenekit

假设我有一个collada文件,其中有一个框,我将dae文件导入到场景中。现在在场景中导入后我知道dae对象是一个盒子。如何将scenekit中的框添加到场景中后获取该框的尺寸

如果我将节点作为SCNBox导入,则会收到错误消息,指出SNCBox不是SCNNode的子类型。

    floorNode = scene.rootNode.childNodeWithName("floor", recursively: false) as SCNBox
    floorNode?.physicsBody = SCNPhysicsBody.staticBody()
    floorNode?.physicsBody?.categoryBitMask = 2

    let floorGeo: SCNBox  = floorNode.geometry! as SCNBox

如果SCNNode是导入节点的唯一方法,我如何获得维度?

3 个答案:

答案 0 :(得分:10)

SCNBox只是SCNGeometry的 helper 子类,用于创建框几何体。当您将Collada导入场景时,您将获得具有SCNGeometries的SCNNode的场景图,而不是SCNBox或SCNCones等,这与它们的外观无关。如果要获取任何节点的维度,则应使用SCNBoundingVolume协议,该协议由SCNNode和SCNGeometry类实现:

func getBoundingBoxMin(_ min: UnsafeMutablePointer, max max: UnsafeMutablePointer) -> Bool

使用此方法,您将获得边界框角。 对于盒形几何体,尺寸将与边界框匹配。

示例:

var v1 = SCNVector3(x:0, y:0, z:0)
var v2 = SCNVector3(x:0, y:0, z:0)
node.getBoundingBoxMin(&v1, max:&v2)

node 是节点,你想获得边界框。 结果将在v1和v2中。

Swift 3

使用Swift 3,您只需分别使用node.boundingBox.minnode.boundingBox.max

答案 1 :(得分:5)

示例Swift代码,介绍如何使用public class MyMainViewModel { public List<Person> Persons { get; set; } }

boundingBox

答案 2 :(得分:0)

Swift 5.4。

导入 ARKit

extension SCNNode {
    
    var height: CGFloat { CGFloat(self.boundingBox.max.y - self.boundingBox.min.y) }
    var width: CGFloat { CGFloat(self.boundingBox.max.x - self.boundingBox.min.x) }
    var length: CGFloat { CGFloat(self.boundingBox.max.z - self.boundingBox.min.z) }
    
    var halfCGHeight: CGFloat { height / 2.0 }
    var halfHeight: Float { Float(height / 2.0) }
    var halfScaledHeight: Float { halfHeight * self.scale.y  }
}

// Usage:
let node = SCNNode()
node.height
node.width
node.lenght