njuyuanrui
njuyuanrui

Reputation: 141

How can I use OBJ file or CTM file instead of DAE file in SceneKit?

I used to render 3d scene with openGL and metal on IOS, and the file format which I used was OBJ and CTM. These days I am trying Scene Kit. It seems that SceneKit only load DAE file. All the demos I can found on the Internet use DAE file , and I can't see the array of vertex and facet in their codes. How can I load OBJ file or CTM file instead of DAE file?

Upvotes: 4

Views: 8096

Answers (5)

Pierre F
Pierre F

Reputation: 1392

Further information regarding the supported file formats:

The following 3D file formats are supported by SceneKit and can be imported to an .scn file using the Scene Editor in Xcode:

DAE, OBJ, Alembic, STL and PLY files.

Source: WWDC 2015 Session "Enhancements to SceneKit" at 02:24

Upvotes: 2

Wil Shipley
Wil Shipley

Reputation: 9553

EDIT: ModelIO can probably load OBJ files now. I haven’t tried this path myself. This answer was written before iOS 9 and OS X 10.11:

SceneKit can't load DAE files on iOS, actually, it actually precompiles the DAE files to an internal format for iOS devices.

If you want to transform your OBJs to DAEs you can write a simple importer/exporter on OS X to do so — on OS X SceneKit will actually read OBJ files (it's not documented but it works) and will write DAEs.

Or you could download the "Assimp" project on github if you'd like to try to read OBJs yourself, but it's going to be a bit of work getting it into SceneKit objects.

Upvotes: 2

Cameron Lowell Palmer
Cameron Lowell Palmer

Reputation: 22246

Loading an OBJ file

It is as simple as passing MDLAsset a valid URL.

private func nodeForURL(url: NSURL) -> SCNNode
{
    let asset = MDLAsset(URL: url)
    let object = asset.objectAtIndex(0)
    let node = SCNNode(MDLObject: object)

    return node
}

This will not only correctly load the .obj file, but it will load referenced .mtl files.

Upvotes: 6

mnuages
mnuages

Reputation: 13462

you can do that by writing your own importer. Take a look at SCNGeometry, SCNGeometrySource and SCNGeometryElement.

edit: starting iOS 9.0 and OS X 10.11 SceneKit can open OBJ files or any other file format supported by Model I/O. You can use previously existing APIs to do that (such as +sceneNamed:) or the new +sceneWithMDLAsset: method.

Upvotes: 4

Hal Mueller
Hal Mueller

Reputation: 7655

As of iOS 9/OS X 10.11, you can use Model I/O's MDLAsset to import OBJ files (and a few other formats). How do you convert Wavefront OBJ file to an SCNNode with Model I/O has sample code.

Upvotes: 2

Related Questions