【问题标题】:Load Big size .obj model in Scenekit. How to Autoresize model in scenekit?在 Scenekit 中加载大尺寸 .obj 模型。如何在场景包中自动调整模型大小?
【发布时间】:2018-08-06 00:02:50
【问题描述】:

我正在 Scenekit 中加载一个 .obj 模型。当我尝试加载像(水瓶)这样的小模型时,它工作得很好。但是当我尝试加载更大的模型(如沙发、桌子)时,它可以完美加载,但会超出场景的边界。

Scenekit 中是否有任何方法,无论模型有多大,我们都可以在 Scenekit 中加载模型。它应该正确地安装在场景中。请查看随附的屏幕截图以获得更好的想法。

如果你能提供一些调整它的提示,请告诉我。

 let url = "https://s3.ap-south-1.amazonaws.com/p9-platform/product/ccbb5daa-982d-4fa1-b475-971453534686.obj"

 let asset = MDLAsset(url: url as URL)
 let scene = SCNScene(mdlAsset: asset)
 let mesh = asset.object(at:0) as! MDLMesh
 let vertexBuffer = mesh.vertexBuffers[0]
 let descripter = mesh.vertexDescriptor
 let submeshes = mesh.submeshes



 for index in 0...(submeshes?.count)! - 1{
    let submesh0 = submeshes![index] as! MDLSubmesh
    let singleMesh = MDLMesh(vertexBuffer: vertexBuffer, vertexCount: mesh.vertexCount, descriptor: descripter, submeshes:  [submesh0])
    let geometry = SCNGeometry(mdlMesh: singleMesh)
    let Node = SCNNode(geometry: geometry)
    let submeshname = submesh0.material?.name as! String
    let materialname = "_\(submeshname)" as! String
    let nodename = submesh0.name as! String
    let revisedName = nodename.replacingOccurrences(of: materialname, with: "")
    Node.name = revisedName
    scene.rootNode.addChildNode(Node)
 }

【问题讨论】:

    标签: ios swift scenekit .obj


    【解决方案1】:

    SCNNode 具有比例属性。我以前也遇到过这个问题,基本上只是在Maya或Blender等程序中创建模型时发生。作者将其放大,以便他们可以使其更详细和复杂。

    不管怎样,你可以试试这个:

    Node.scale = SCNVector3(0.001, 0.001, 0.001)
    

    Node 也不应该以大写字母开头 ^_________^

    【讨论】:

    • “作者把它放大了,这样他们就可以使它更详细和复杂。”它不是那样工作的。 :) Scenekit 中的一个单位是 1 米,而模型可能以英寸或厘米(maya 的默认值)为单位建模(或者更好地说是导出)。
    【解决方案2】:

    您可以检查此网格的边界框。然后你就会知道最大点和最小点,从而知道它有多大。

    然后,您可以计算一个缩放值来帮助您缩放网格。

    if let object = asset.object(at: 0) as? MDLMesh {
                        
        let node = SceneComplex.shared.object
        node.geometry = SCNGeometry(mdlMesh: object)
        
        let (minB, maxB) = node.boundingBox
        let diff = maxB.x - minB.x
        let scale = 10.0 / diff // A good scale value depends on many factors
        
        node.scale = SCNVector3(scale, scale, scale)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2019-02-15
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      相关资源
      最近更新 更多