在Swift中使用SceneKit计算3D模型的表面积



我正在尝试计算在场景视图中加载的3D网格/对象的表面积和体积。

我从stackoverflow中尝试了一些解决方案,但实际表面积比计算出的要小得多。

这是我的代码。

private func calculateSuperficialAreaOfMesh() -> Float {        
let points = modelNode.childNodes[0].geometry!.vertices() ?? []

var len = points.count
var area = 0.0

if(len == 0) {
return 0.0
}

var i = 0
var va: SCNVector3
var vb: SCNVector3
var vc: SCNVector3

repeat {
va = points[i]
vb = points[i + 2]
vc = points[i + 3]


let ab = SCNVector3(x: vb.x - va.x, y: vb.y - va.y, z: vb.z - va.z)
let ac = SCNVector3(x: vc.x - va.x, y: vc.y - va.y, z: va.z - vc.z)

let cross = ab.cross(vector: ac)
area += Double(sqrt(pow(cross.x, 2) + pow(cross.y , 2) + pow(cross.z, 2))) / 2

i += 3
} while (i < points.count - 3)


return Float(area)
}

和从

获取顶点
extension SCNGeometry {

/**
Get the vertices (3d points coordinates) of the geometry.

- returns: An array of SCNVector3 containing the vertices of the geometry.
*/
func vertices() -> [SCNVector3]? {

let sources = self.sources(for: .vertex)

guard let source  = sources.first else{return nil}

let stride = source.dataStride / source.bytesPerComponent
let offset = source.dataOffset / source.bytesPerComponent
let vectorCount = source.vectorCount

return source.data.withUnsafeBytes{ (buffer : UnsafePointer<Float>) -> [SCNVector3] in

var result = Array<SCNVector3>()
for i in 0...vectorCount - 1 {
let start = i * stride + offset
let x = buffer[start]
let y = buffer[start + 1]
let z = buffer[start + 2]
result.append(SCNVector3(x, y, z))
}
return result
}
}
}

我已经搜索了您的解决方案。我发现你可以测量两个三维点之间的距离,我认为你也可以用它来测量表面面积。本教程可以指导您:链接到ARKit测量对象

最新更新