簡體   English   中英

使用 SceneKit 計算 3D model 在 Swift 中的表面積

[英]Calculate surface area of a 3D model in Swift using SceneKit

我正在嘗試計算我在場景視圖中加載的 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
    }
}
}

我已經搜索了您的解決方案。 我發現你可以測量兩個 3d 點之間的距離,通過使用我認為你也可以實現表面積。 本教程可以指導您:鏈接到 ARKit 測量 object

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM