[PYTHON] Getting started with USD on Windows

Under USD related investigation

Python edition

For the time being, it seems good to be able to handle USD in Python. We will use NVIDIA pre-build.

https://developer.nvidia.com/usd

ʻUSD 20.08, use Python 3.6`.

python3.6 installation

I put it in C: / Python36

Expand USD archive

Expanded to C: / Python36 / usd-20-08 and set the environment variable ʻUSDROOT` here.

usd-20-08-win64_py36_release.zip README.txt excerpt


== Python 3.6 ==
(Tested on python 3.6.7)

- Add %USDROOT%\bin and %USDROOT%\lib to the front of %PATH%
- Add %USDROOT%\lib\python to the front of %PYTHONPATH%
- Install PySide2 and PyOpenGL to python, e.g., python -m pip install PySide2 PyOpenGL

It is necessary to set PYTHONPATH and PATH. I will set it locally in the project with vscode.

vscode project

Create a hello_usd folder. Open the folder with vscode. Since it is usually python3.8, use python3.6 only for this project and set the environment variables for python locally.

.vscode/settings.json


{
    "python.pythonPath": "C:\\Python36\\python.exe",
    "python.envFile": "${workspaceFolder}/.env",
}

Variable expansion of .env is similar to settings.json, and environment variables are $ {env: XXX}.

.env


PYTHONPATH=${env:USDROOT}\\lib\\python
PATH=${env:USDROOT}\\bin;${env:USDROOT}\\lib;$PATH

Experiment

import sys
import os
import pathlib
USDROOT = pathlib.Path(os.environ['USDROOT'])


def main(teapot: pathlib.Path):
    from pxr import Usd
    stage_ref = Usd.Stage.Open(str(teapot))
    prim = stage_ref.GetDefaultPrim()
    print(f'{prim.GetPath()}')
    print(f'type: {prim.GetTypeName()}')

    for child in prim.GetChildren():
        print(f'{child.GetPath()}, type: {child.GetTypeName()}')

        # if child.GetTypeName() == 'Mesh':
        for attr in child.GetAttributes():
            print(f'   {attr}')


if __name__ == "__main__":
    teapot = USDROOT / "tests/ctest/testUsdLuxListAPI/teapot.usda"
    main(teapot)

Somehow it worked. For what you do with Python,

The combination of is relatively easy.

Toolset

https://graphics.pixar.com/usd/docs/USD-Toolset.html

usdview

The usd package bin / usdview is the command to start the viewer.

https://github.com/PixarAnimationStudios/USD/blob/release/pxr/usdImaging/bin/usdview/usdview.py

We will modify usdview.cmd a little to prepare environment variables.

usdview.cmd


set PYTHONPATH=%USDROOT%\lib\python
set PATH=%USDROOT%\bin;%USDROOT%\lib;%PATH%
@py -3.6 "%~dp0usdview" %*

I tried to associate ʻusda, ʻusdc, ʻusdz` with bin / usdview.cmd.

usdview.jpg

Viewpoint operation with alt + drag (l, r, m)

C ++ edition

It was easy to get the USD source and build with build_usd.py.

build_usd.py

Automatically build with build_scripts / build_usd.py that comes with the USD source.

First, open the dos window from x64 Native Tools Command Prompt for VS2019 which can be done by installing vc.

# cl.The exe is in the path.
> cl.exe
Microsoft (R) C/C++ Optimizing Compiler Version 19.27.29111 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

Go to the usd source folder. Execute after passing python to PATH.

> set PATH=C:\Python36;%PATH%
> C:\Python36\python.exe build_scripts\build_usd.py
usage: build_usd.py [-h] [-n] [-v | -q] [-j JOBS] [--build BUILD]
                    [--build-args [BUILD_ARGS [BUILD_ARGS ...]]]
                    [--force FORCE_BUILD] [--force-all]
                    [--generator GENERATOR] [--src SRC] [--inst INST]
                    [--build-shared | --build-monolithic] [--debug]
                    [--tests | --no-tests] [--examples | --no-examples]
                    [--tutorials | --no-tutorials] [--tools | --no-tools]
                    [--docs | --no-docs] [--python | --no-python]
                    [--imaging | --usd-imaging | --no-imaging]
                    [--ptex | --no-ptex] [--openvdb | --no-openvdb]
                    [--usdview | --no-usdview] [--embree | --no-embree]
                    [--prman | --no-prman] [--prman-location PRMAN_LOCATION]
                    [--openimageio | --no-openimageio]
                    [--opencolorio | --no-opencolorio]
                    [--alembic | --no-alembic] [--hdf5 | --no-hdf5]
                    [--draco | --no-draco] [--draco-location DRACO_LOCATION]
                    [--materialx | --no-materialx]
                    install_dir
build_usd.py: error: the following arguments are required: install_dir

There are many options, so choose according to your needs. This time, I did the following because I want to do a debug build related to hydra.

> C:\Python36\python.exe build_scripts\build_usd.py --debug --build-monolithic --no-tests --no-examples --no-tutorials --no-docs --no-python --usd-imaging C:\usd_debug
Building with settings:
  USD source directory          C:\USD
  USD install directory         C:\usd_debug
  3rd-party source directory    C:\usd_debug\src
  3rd-party install directory   C:\usd_debug
  Build directory               C:\usd_debug\build
  CMake generator               Default
  Downloader                    curl

  Building                      Shared libraries
    Config                      Debug
    Imaging                     On
      Ptex support:             Off
      OpenVDB support:          Off
      OpenImageIO support:      Off
      OpenColorIO support:      Off
      PRMan support:            Off
    UsdImaging                  On
      usdview:                  Off
    Python support              Off
      Python 3:                 On
    Documentation               Off
    Tests                       Off
    Examples                    Off
    Tutorials                   Off
    Tools                       On
    Alembic Plugin              Off
      HDF5 support:             Off
    Draco Plugin                Off
    MaterialX Plugin            Off

  Dependencies                  zlib, boost, TBB, GLEW, OpenSubdiv
STATUS: Installing zlib...
STATUS: Installing boost...
STATUS: Installing TBB...
STATUS: Installing GLEW...
STATUS: Installing OpenSubdiv...
STATUS: Installing USD...

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

    The following in your PATH environment variable:
    C:\usd_debug\bin
    C:\usd_debug\lib

I was able to build in about 10 minutes.

Use the built library

https://github.com/ousttrue/usd_cpp_samples

project(cpp_usd)
cmake_minimum_required(VERSION 3.0.0)

set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Debug/lib)
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Debug/lib)
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Debug/bin)
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release/lib)
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release/lib)
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release/bin)

find_package(pxr CONFIG REQUIRED)

link_directories(
    $ENV{VCPKG_DIR}/installed/x64-windows/lib
)

add_executable(cpp_usd
    main.cpp
)
target_include_directories(cpp_usd
PRIVATE
    C:/usd_debug/include
    C:/usd_debug/include/boost-1_70
)
target_compile_options(cpp_usd
PRIVATE
    /wd4244
    /wd4305
    )
target_link_libraries(cpp_usd
PRIVATE
    C:/usd_debug/lib/usd_ms.lib #I built it with monolithic, so tf, gf, sdf, usd,usdGeom etc. are gathered together
    C:/usd_debug/lib/tbb_debug.lib
)

It worked if I put the PATH in C: / usd_debug / bin and C: / usd_debug / lib at runtime.

vcpkg

No ALEMBIC or Python.

./vcpkg install usd

did it.

https://fereria.github.io/reincarnation_tech/11_Pipeline/30_USD_Programming/00_CPP/00_start_cpp/

I will try. I was able to build.

CMakeLists.txt


project(cpp_usd)
cmake_minimum_required(VERSION 3.0.0)

set(USD_DIR $ENV{VCPKG_DIR}/installed/x64-windows)
set(BOOST_INCLUDE_DIR $ENV{VCPKG_DIR}/installed/x64-winddows/include)

# tbb_debug.lib is#Since it is specified by pragma, for the time being
link_directories(
    ${USD_DIR}/lib
    ${USD_DIR}/debug/lib
)

add_executable(cpp_usd
main.cpp
)
target_include_directories(cpp_usd
PRIVATE
    ${USD_DIR}/include
    ${BOOST_INCLUDE_DIR}
)
target_compile_definitions(cpp_usd
PRIVATE
    TBB_USE_DEBUG=0 #Since tbb causes a compile error, for the time being
)
target_compile_options(cpp_usd
PRIVATE
    /wd4244
    /wd4305
    )
target_link_libraries(cpp_usd
PRIVATE
    ${USD_DIR}/lib/tf.lib
    ${USD_DIR}/lib/sdf.lib
    ${USD_DIR}/lib/usd.lib
    ${USD_DIR}/lib/usdgeom.lib
    ${USD_DIR}/lib/trace.lib
)

But it fits.

Coding Error: in CreateAnonymous at line 313 of C:\vcpkg\buildtrees\usd\src\2cd10d91c8-241e05f4dd.clean\pxr\usd\sdf\layer.cpp -- Cannot determine file format for anonymous SdfLayer
Coding Error: in Open at line 994 of C:\vcpkg\buildtrees\usd\src\2cd10d91c8-241e05f4dd.clean\pxr\usd\usd\stage.cpp -- Invalid root layer

vcpkg can also make debug builds, so I attached and tracked the debugger. The environment variable PXR_PLUGINPATH_NAME should point to the location of plugInfo.json.

cmake/macros/Private.cmake


            PXR_BUILD_LOCATION=usd
            PXR_PLUGIN_BUILD_LOCATION=../plugin/usd

It doesn't seem to work if the folder structure changes

It doesn't work yet. Next error

Coding Error: in _Load at line 248 of C:\vcpkg\buildtrees\usd\src\2cd10d91c8-241e05f4dd.clean\pxr\base\plug\plugin.cpp -- Load of 'c:/vcpkg/installed/x64-windows/lib/usd.dll' for 'usd' failed:The specified module cannot be found.
Coding Error: in _Load at line 248 of C:\vcpkg\buildtrees\usd\src\2cd10d91c8-241e05f4dd.clean\pxr\base\plug\plugin.cpp -- Load of 'c:/vcpkg/installed/x64-windows/lib/usd.dll' for 'usd' failed:The specified module cannot be found.

Not c: /vcpkg/installed/x64-windows/lib/usd.dll, but c: /vcpkg/installed/x64-windows/bin/usd.dll. Fixed the contents of pluginfo.json.

lib/usd/**/plulgInfo.json


"LibraryPath": "../../ndr.dll", 
//Fix
"LibraryPath": "../../../bin/ndr.dll", 

It finally worked.

https://github.com/microsoft/vcpkg/pull/13687

USD details

Post-build structure

lib
  usd.dll
  sdf.dll

  usd
     plugInfo.json # PXR_PLUGINPATH_Can be specified with the NAME environment variable
     
     usd/resources/plugInfo.json
     sdf/resources/plugInfo.json

plugin
  usd
    plugInfo.json # PXR_PLUGINPATH_Can be specified with the NAME environment variable
    
    usdShaders.dll
    usdShaders/resources/plugInfo.json

If you change the folder structure like this, you need to pay attention to the contents of the PXR_PLUGINPATH_NAME environment variable and plugInfo.json. If you make a mistake

auto stage = pxr::UsdStage::CreateInMemory(); //plugin fails to load and becomes null

Something like that happens.

plug initialization

// plug.dll
Plug_InitConfig
// "C:\\vcpkg\\installed\\x64-windows\\debug\\bin\\plug.dll" <= GetModule
// sharedLibPath = "C:\\vcpkg\\installed\\x64-windows\\debug\\bin reference directory
Plug_SetPaths
  PXR_PLUGINPATH_NAME
  sharedLibPath + PXR_BUILD_LOCATION=usd
  sharedLibPath + PXR_PLUGIN_BUILD_LOCATION=../plugin/usd

Source

extras
  imaging
    examples
      hdTiny #hydra sample
  usd
    examples
    tutorials

C ++ edition (hydra)

Blender-2.83

It seems that UsdSkel support is not yet available, so I feel like I can't put out a model with bones.

The USD Import / Export is a c ++ implementation rather than a python addon. The USD Python binding doesn't seem to be enabled. Boost-Python is annoying. Recognize.

Unity

It seems that there are already some places that are likely to be used up to Skinning Mesh.

Wrap usd with swig so that it can be used from C #

Note

Unknown

Since usd is a c ++ dll, it is confusing that functions cannot be easily called from other languages. I hope there is an interface for C. It might be a good idea to make a python version from the unity version of swig.

Recommended Posts

Getting started with USD on Windows
Getting started with Python 3.8 on Windows
Getting started with Android!
1.1 Getting Started with Python
Getting Started with Golang 2
Getting started with apache2
Getting Started with Golang 1
Getting Started with Python
Getting Started with Django 1
Getting Started with Optimization
Getting Started with Golang 3
Getting Started with Numpy
Getting started with Spark
Getting Started with Python
Getting Started with Pydantic
Getting Started with Golang 4
Getting Started with Jython
Getting Started with Django 2
Getting started with Python with 100 knocks on language processing
Translate Getting Started With TensorFlow
Getting Started with Python Functions
Getting Started with Tkinter 2: Buttons
Getting Started with PKI with Golang ―― 4
Getting Started with Python Django (1)
Getting Started with Python Django (3)
Getting Started with Python Django (6)
Getting Started with Django with PyCharm
Python3 | Getting Started with numpy
Getting Started with Python Django (5)
Blogging with Pelican on Windows
Getting Started with Python responder v2
Let's get started with Python ~ Building an environment on Windows 10 ~
Getting Started with Git (1) History Storage
Get started with MicroPython (on macOS)
Getting started with Sphinx. Generate docstring with Sphinx
Getting Started with Python Web Applications
Getting Started with Python for PHPer-Classes
Getting Started with Sparse Matrix with scipy.sparse
Getting Started with Julia for Pythonista
Getting Started with Python Basics of Python
Run SwitchBot on Windows 10 with Bleak
Use Tensorflow 2.1.0 with Anaconda on Windows 10!
Getting Started with Cisco Spark REST-API
Getting Started with Python Genetic Algorithms
Getting Started with Python for PHPer-Functions
Getting Started with CPU Steal Time
Building a Windows 7 environment for getting started with machine learning with Python
Getting started on how to solve linear programming problems with PuLP
Getting Started with python3 # 1 Learn Basic Knowledge
Getting Started with Flask with Azure Web Apps
Getting Started with Python Web Scraping Practice
Django + Apache with mod_wsgi on Windows Server 2016
Getting Started with Python for PHPer-Super Basics
Getting Started with Python Web Scraping Practice
Getting started with Dynamo from Python boto
Getting Started with Lisp for Pythonista: Supplement
Getting Started with Heroku, Deploying Flask App
Getting Started with TDD with Cyber-dojo at MobPro
Python on Windows
Grails getting started
MongoDB Basics: Getting Started with CRUD in JAVA