获取dae节点的大小

Sid*_*kar 8 scenekit

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

如果我将节点作为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
Run Code Online (Sandbox Code Playgroud)

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

Ef *_*Dot 10

SCNBox只是SCNGeometry的辅助子类,用于创建框几何体.当您将Collada导入场景时,您将获得具有SCNGeometries的SCNNodes的场景图,而不是SCNBox'es或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)
Run Code Online (Sandbox Code Playgroud)

节点为节点,你想要得到边界的框.结果将在v1和v2中.

斯威夫特3

使用Swift 3,你可以分别使用node.boundingBox.minnode.boundingBox.max.


小智 5

关于如何使用getBoundingBoxMin的示例swift代码:

var min = shipNode.boundingBox.min
var max = shipNode.boundingBox.max
let w = CGFloat(max.x - min.x)
let h = CGFloat(max.y - min.y)
let l = CGFloat(max.z - min.z)
let boxShape = SCNBox (width: w , height: h , length: l, chamferRadius: 0.0)
let shape = SCNPhysicsShape(geometry: boxShape, options: nil)

shipNode.physicsBody!.physicsShape = SCNPhysicsShape(geometry: boxShape, options: nil)
shipNode.physicsBody = SCNPhysicsBody.dynamic()
Run Code Online (Sandbox Code Playgroud)