0

I'm trying to use Model I/O as a quicker way to render imported 3d models for my iOS app. I have written a little bit of code importing and displaying a 3d model I have made with a .obj file format. For some reason, when I run my app only a black screen appears.Here is my code:

import UIKit
import ModelIO
import SceneKit
import SceneKit.ModelIO

class ViewController: UIViewController {


var sceneView: SCNView {
    return self.view as! SCNView
}

override func viewDidLoad() {
     // Do any additional setup after loading the view, typically from                a nib.
    guard let url = Bundle.main.url(forResource: "Digestive_System",      withExtension: "obj") else {
        fatalError("Failed to find model")

    }

    //Load Object
    let asset = MDLAsset(url:url)
    guard let object = asset.object(at: 0) as? MDLMesh else {
        fatalError("failed to get mesh from asset")
    }

    // Wrap Model I/O object in SceneKit object
    let scene = SCNScene()
    let node = SCNNode(mdlObject: object)
    scene.rootNode.addChildNode(node)


    //Display Scene

    sceneView.autoenablesDefaultLighting = true
    sceneView.allowsCameraControl = true
    sceneView.scene = scene
    sceneView.backgroundColor = UIColor.black








     super.viewDidLoad()
     }

side note: my model is located in the main folder of the app.

Thanks for your help guys! Noa

Abhishek Jain
  • 4,557
  • 2
  • 32
  • 31

1 Answers1

0

I have rendered .Obj model using Model I/O as:

  1. Load model from bundle

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"modelName" withExtension:@"obj"];
    MDLAsset *asset = [[MDLAsset alloc] initWithURL:url];
    MDLMesh *meshObject = (MDLMesh *)[asset objectAtIndex:0];
    
  2. Apply material to model

    MDLScatteringFunction *scattering = [MDLScatteringFunction new];
    MDLMaterial *mdMaterial = [[MDLMaterial alloc] initWithName:@"material" 
    scatteringFunction:scattering];
    
    NSURL *baseMaterialURL = [[NSBundle mainBundle] 
    URLForResource:@"Image_Base_Color" withExtension:@"png"];
    MDLMaterialProperty *baseColor = [MDLMaterialProperty new];
    [baseColor setType:MDLMaterialPropertyTypeTexture];
    [baseColor setSemantic:MDLMaterialSemanticBaseColor];
    [baseColour setURLValue:baseMaterialURL];
    [material setProperty:baseColor];
    
     for(MDLSubmesh *subMesh in meshObject.submeshes)
     {
        sub.material = material;
     }
    
  3. Add model to scene

     SCNNode *baseModelNode = [SCNNode nodeWithMDLObject:object];
     [self.sceneView.scene rootNode] addChildNode:self.baseModelNode];
    

You can set scale and position as per your requirement.

The iCoder
  • 1,414
  • 3
  • 19
  • 39