Samson T
Samson T

Reputation: 67

Can I convert a USDZ to solid mesh such as stl

I used an ios app to create a usdz file using arkit but now I want to convert the scan to a solid 3d model such as an stl or obj. is there an ios or mac application that allows for this conversion. I cannot find any app that can open them other than xcode and preview but neither allow me to export to a 3d model.

Upvotes: 6

Views: 11570

Answers (4)

Sir Osafc
Sir Osafc

Reputation: 1

Simply try blender. I have this issue and now I find that blender has a really good support with USD files. You can easily import USD files into blender and edit them with textures. Then export them in USD format or other 3D format such as *.stl.

Upvotes: 0

user12805200
user12805200

Reputation: 41

Simply directly open .USDZ or USDC file in XCODE

If you have unzipped the .zip you will keep an .USDC file and a folder called "0" which contains all the textures, materials, alpha in .PNG.

Once opened .USDZ or .USDC in XCODE >> File >> Export

You can directly choose the main .OBJ .STL formats and many others

enter image description here

Upvotes: 4

wr0ngway
wr0ngway

Reputation: 198

Thanks! Exactly what I was looking for. I created a Mac OS script to automate this in Terminal. I also did something similar in an Automator Quick Action to run from Finder with a RightClick on the file, but couldn't figure out a way to attach that here.

#!/usr/bin/env osascript -l JavaScript

// Save to a file, e.g. usdz2stl.js
// chmod +x usdz2stl.js
// usdz2stl.js /path/to/model.usdz

ObjC.import('ModelIO')

function run(argv) {
  var inFile = argv[0];
  var outFile = inFile + ".stl";
  console.log("Converting " + inFile + " ...");
  var usdz = $.NSURL.alloc.initFileURLWithPath(inFile);
  var asset = $.MDLAsset.alloc.initWithURL(usdz);
  var stl = $.NSURL.alloc.initFileURLWithPath(outFile);
  asset.exportAssetToURL(stl);
  console.log("Conversion Complete: " + outFile);
}

Upvotes: 6

jlsiewert
jlsiewert

Reputation: 3554

ModelIO can, at least in iOS.

import ModelIO

let usdz = URL(fileURLWithPath: "model.usdz")
let asset = MDLAsset(url: usdz)
let stl = URL(fileURLWithPath: "model.stl")
try asset.export(to: stl)

.usdz is just a zipped .usdc file with textures (from the offical documentation). If you want to export the file on a mac, change the file extension to .zip, unzip the file and use ModelIO to export a .stl file.

Open Xcode, create a new Playground, choose macOS as the platform. I have downloaded a test file from Apple's Quick Look Gallery, and unzipped an example to stratocoaster_usdz/ in my Downlaods directory. Then use the following code:

import ModelIO

// Get the path to the Downloads directory in your home folder
let directory = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first!
let usdc = URL(fileURLWithPath: "stratocaster_usdz/Stratocaster.usdc", relativeTo: directory)

// Load the usdc file that was packed in the usdz file
let asset = MDLAsset(url: usdc)

do {
    let target = URL(fileURLWithPath: "stratocaster.stl", relativeTo: directory)
    // Export to .stl
    try asset.export(to: target)
} catch {
    error
}

Upvotes: 7

Related Questions