假设我有一个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是导入节点的唯一方法,我如何获得维度?
答案 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.min
和node.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