TimvanScherpenzeel / gltf-to-usdz-research

Research and proof of concept of converting glTF to USDZ for AR Quick Look (iOS 12+).
MIT License
188 stars 18 forks source link
ar cli converter gltf ios pbr pixar proof-of-concept quicklook usd usdz xcode

glTF to USDZ research

Research and proof of concept of converting glTF to USDZ for AR Quick Look (iOS 12+).

Reasoning

Even though I think the intentions of Apple / Pixar are great with the open source USD pipeline I think we as an industry should be relying more on truly open formats that are not controlled by a single entity. Installing USD is cumbersome, requires a lot of disk space and is completely overkill for most situations (if your goal is to convert some 3D models to USDZ and show them using AR Quick Look). I'm hoping that as we get closer to the public release of iOS 12 more tools will pop up that directly convert to USDZ so that we can get cross-platform support.

In order to move away from using the USD pipeline solution offered by Pixar I think it would be wise to try and manipulate the intermediary readeable USDA format. Unfortunately there are very little examples available of USDA files.

The general idea is to dynamically generate / manipulate the intermediary a general USDA file-structure and pass that to the usdz-converter to handle the further conversion to USDZ.

After some work, debugging and friendly help from @domenicopanacea and @virakri I got it to work. Most of the findings on OBJ support come from @trayser who posted details regarding OBJ to USDZ conversion on developers.apple.com. The OBJ files that are generated by gltf-to-usdz only use the supported tags as mentioned by @trayser.

Please note that this is just an experimental setup and should be seen as a proof of concept. As it stands I've only tested it with the DamagedHelmet glTF asset included in /assets/. You will very likely run into issues with the current code.

My goal of this research is to inspire others to make proper converters that handle all the complexities.

Live demo

Live demo

Screenshot

Limitations

To do

Installation

https://developer.apple.com/download/
sudo xcode-select --switch /Applications/Xcode-beta.app
node ./bin/gltf-to-usdz.js -i ./assets/DamagedHelmet/DamagedHelmet.gltf -o ./assets/DamagedHelmet.usda -s 10.0 && xcrun usdz_converter ./assets/DamagedHelmet.usda ./assets/DamagedHelmet-`date +"%H-%M-%S"`.usdz
2018-06-20 17:21:23.364 usdz_converter[82749:13335731]

Converting asset file 'DamagedHelmet.usda' ...

In order to see the contents of the outputted USDZ change the extension to .zip and unzip it. You will see a .usdc and several textures (if the original glTF file had textures).

Development

In order to install USD on MacOS please follow the following instructions:

https://developer.apple.com/download/
sudo xcode-select --switch /Applications/Xcode-beta.app
brew install cmake
brew install qt@4
pip install PyOpenGL
pip install --index-url=http://download.qt.io/snapshots/ci/pyside/5.9/latest/ pyside2 --trusted-host download.qt.io
diff --git a/build_scripts/build_usd.py b/build_scripts/build_usd.py
index 37fb2a5e..3c940b3b 100644
--- a/build_scripts/build_usd.py
+++ b/build_scripts/build_usd.py
@@ -692,7 +692,7 @@ PTEX = Dependency("Ptex", InstallPtex, "include/PtexVersion.h")
 ############################################################
 # OpenImageIO

-OIIO_URL = "https://github.com/OpenImageIO/oiio/archive/Release-1.7.14.zip"
+OIIO_URL = "https://github.com/OpenImageIO/oiio/archive/Release-1.8.12.zip"

 def InstallOpenImageIO(context, force):
     with CurrentWorkingDirectory(DownloadURL(OIIO_URL, context, force)):
@@ -855,6 +855,12 @@ def InstallUSD(context):

         if context.buildPython:
             extraArgs.append('-DPXR_ENABLE_PYTHON_SUPPORT=ON')
+            if MacOS():
+                import distutils.sysconfig
+                pyLibPath = distutils.sysconfig.get_config_var('LIBDIR')
+                pyIncPath = distutils.sysconfig.get_config_var('INCLUDEPY')
+                extraArgs.append('-DPYTHON_LIBRARY=' + pyLibPath + '/libpython2.7.dylib')
+                extraArgs.append('-DPYTHON_INCLUDE_DIR=' + pyIncPath)
         else:
             extraArgs.append('-DPXR_ENABLE_PYTHON_SUPPORT=OFF')
➜  pixar python USD/build_scripts/build_usd.py BUILD

Building with settings:
  USD source directory          /Users/timvanscherpenzeel/Projects/pixar/USD
  USD install directory         /Users/timvanscherpenzeel/Projects/pixar/BUILD
  3rd-party source directory    /Users/timvanscherpenzeel/Projects/pixar/BUILD/src
  3rd-party install directory   /Users/timvanscherpenzeel/Projects/pixar/BUILD
  Build directory               /Users/timvanscherpenzeel/Projects/pixar/BUILD/build
  CMake generator               Default
  Downloader                    curl

  Building                      Shared libraries
    Imaging                     On
      Ptex support:             Off
    UsdImaging                  On
    Python support              On
    Documentation               Off
    Tests                       Off
    Alembic Plugin              Off
      HDF5 support:             Off
    Maya Plugin                 Off
    Katana Plugin               Off
    Houdini Plugin              Off

    Dependencies                zlib, boost, TBB, JPEG, TIFF, PNG, OpenEXR, GLEW, OpenImageIO, OpenSubdiv

STATUS: Installing zlib...
STATUS: Installing boost...
STATUS: Installing TBB...
STATUS: Installing JPEG...
STATUS: Installing TIFF...
STATUS: Installing PNG...
STATUS: Installing OpenEXR...
STATUS: Installing GLEW...
STATUS: Installing OpenImageIO...
STATUS: Installing OpenSubdiv...
STATUS: Installing USD...

Success! To use USD, please ensure that you have:

    The following in your PYTHONPATH environment variable:
    /Users/timvanscherpenzeel/Projects/pixar/BUILD/lib/python

    The following in your PATH environment variable:
    /Users/timvanscherpenzeel/Projects/pixar/BUILD/bin

Taking apart a USDZ file

To take apart a USDZ file one should follow the following steps:

  1. Follow the steps mentioned in Development to install USD
  2. Change the extension of the usdz file from .usdz to .zip
  3. Unzip the file using Archive Utility (comes with MacOS) or likely any other unzipping tool

The folder will contain the included textures seperated out and a .udsc file.

  1. Now use usdcat to convert the USDC file to readeable USDA: usdcat input.usdc -o output.usda

The resulting USDA file will contain the mesh data.

Resources

Contributing

As it is my goal to create a community project I welcome you to submit any pull requests or open a ticket if you spot an issue. Please be aware that as of now the project is in a very experimental state and only serves as a proof of concept so there are probably lots of things wrong and the code is far from clean.

Licence

gltf-to-usdz is released under the MIT licence.