假设我有一个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.min和node.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)
| 归档时间: |
|
| 查看次数: |
5973 次 |
| 最近记录: |