TinyUSDZ
是一个安全、可移植且无依赖(仅依赖C++ STL,包含其他第三方库。是的,你不需要pxrUSD/OpenUSD库!)的USDZ/USDC/USDA库,使用C++14编写。
Wasm演示!(需要下载10MB文件)
<img src="https://github.com/syoyo/tinyusdz/assets/18676/2419ddf6-4410-4bcc-b9c1-466bf29d3b20" width="400px"> (来自 https://github.com/syoyo/Vulkan-glTF-USDZ-PBR) <img src="https://github.com/lighttransport/tinyusdz/assets/18676/5291f44f-b20a-4d4a-9b4a-16ffefccddc7" width="400px"> (来自ASF MaterialXViewer分支 https://github.com/lighttransport/materialx)Linux | Windows | macOS | iOS | Android | |
---|---|---|---|---|---|
开发版 |
Linux | Windows | macOS | iOS | Android | WASM(WASI) | WASM(Emscripten) | |
---|---|---|---|---|---|---|---|
开发版 | ✅ 64位 </br> ✅ 32位 </br> ✅ aarch64 | ✅ 64位 </br> ✅ 32位 </br> ✅ ARM64/ARM32 | ✅ | ✅ | ✅ | ✅ [sandbox/wasi](https://github.com/lighttransport/tinyusdz/blob/dev/sandbox/wasi | ✅ [sandbox/emscripten](https://github.com/lighttransport/tinyusdz/blob/dev/sandbox/emscripten |
TinyUSDZ 目前处于 v0.8.0 候选发布版本。
核心加载功能(包括 USDA 和 USDC)现已可用,并且达到了生产级别(对于损坏的 USDA/USDC/USDZ 输入也不会发生段错误)。
用于使用 OpenGL/Vulkan 类渲染器渲染 USD 模型的 Tydra 框架已经初步可用。https://github.com/syoyo/tinyusdz/issues/148
v0.8.0版本基本上只支持扁平化场景(即使用pxrUSD的usdcat --flatten
生成的USDA/USDC或USDZ场景)。
组合功能目前正在开发中(v0.8.0中的组合功能支持是实验性的。计划在下一个主要版本v0.9.0(预计2024年 第三季度)中提供更好的组合功能支持)。
v0.8.0发布前的剩余任务包括编写示例、演示和实用函数(特别是Tydra,主要是访问材质/着色器属性)。
更多详情请参见 doc/status.md
c-tinyusd
)
我们已经开放了GitHub讨论页面!https://github.com/syoyo/tinyusdz/discussions
TinyUSDZ将安全性和稳定性作为首要考虑。
USDZ(USDC)是一种二进制格式。为了避免在加载恶意USDZ(例如来自未知来源的USDZ文件)时出现越界访问、内存 溢出和其他安全问题,TinyUSDZ具有内存预算功能以避免内存溢出问题。
要限制加载USDZ文件时的内存使用,请在USDLoadOptions中设置max_memory_limit_in_mb
值。
TinyUSDZ源代码(以及一些外部第三方代码)也通过地址消毒器、CodeQL和模糊测试进行检查。
请参见tests/fuzzer。 要构建模糊测试,您需要Meson和Ninja。
如果您需要处理来自未知来源的任意USD文件(例如来自互联网、NFT存储,可能包含恶意数据),建议在沙盒环境(RunC、FlatPak、WASI(WASM))中使用TinyUSDZ。目前推荐在WASI中运行。
TinyUSDZ不使用C++异常,可以在无线程的情况下构建。TinyUSDZ支持WASM和WASI构建。因此,TinyUSDZ应该能在各种Web平台(WebAssembly。无需SharedArrayBuffer、Atomics和WebAssembly SIMD(iOS Safari尚不支持))和沙盒环境(WASI。适用于需要从互联网、IPFS或区块链存储读取可能包含恶意数据的各种USD文件的用户)上运行良好。
有关使用WASI工具链构建TinyUSDZ的信息,请参见sandbox/wasi/。
USD本身是一个通用的3D场景数据容器。
Tydra是渲染器/查看器和其他DCC的接口。 Tydra可能类似于pxrUSD Hydra的精简版本,但其API完全不同。有关背景信息,请参见src/tydra/README.md。
TinyUSDZ不支持Reality Composer文件格式(.reality
),因为它使用专有文件格式,我们无法理解(因此也不支持与Reality的相互转换)。
TinyUSDZ专注于USDA/USDC/USDZ的加载/写入功能。 示例查看器仅用于演示目的。
如果您需要商业支持、生态系统开发(例如基于TinyUSDZ的插件、DCC工具)或生产级USDZ模型查看器(例如将TinyUSDZ嵌入到您的AR应用程序中,能够显示(加密)USDZ模型的3D NFT Android移动查看器),请联系Light Transport Entertainment, Inc.:https://goo.gl/forms/1p6uGcOKWGpXPHkA2
我们也在寻找赞助商。如果您对赞助(或捐赠)TinyUSDZ项目感兴趣,也请联系Light Transport Entertainment, Inc.了解详情:https://goo.gl/forms/1p6uGcOKWGpXPHkA2
CMakePresets.json
,但在VS2022中似乎有点麻烦 https://github.com/lighttransport/tinyusdz/pull/182#issuecomment-2236676598 。如果遇到问题,暂时使用vcsetup.bat
来设置.sln。也支持使用C++17进行编译。 C++20和C++23的编译可能也可以,但尚未经过充分测试,因为C++20/C++23编译器还不够成熟(截至2024/01)
如果您使用CMake,只需使用add_subdirectory
包含tinyusdz仓库,并将包含路径设置为<tinyusdz>/src
我们建议使用CMake 3.24或更高版本。
(最低要求是3.16)
... # 当tinyusdz作为库通过`add_subdirectory`构建时,TinyUSDZ示例、测试和工具的构建默认是禁用的 add_subdirectory(/path/to/tinyusdz tinyusdz) target_include_directories(YOUR_APP PRIVATE "/path/to/tinyusdz/src") # 提供了命名空间静态库目标`tinyusdz::tinyusdz_static`。 # 目前我们建议使用TinyUSDZ的静态构建。 # 对于旧版本的cmake,您也可以使用别名目标`tinyusdz_static`。 target_link_libraries(YOUR_APP PRIVATE tinyusdz::tinyusdz_static) # 对于TinyUSDZ DLL(共享)库目标,您可以使用 # `tinyusdz`库目标
另一种方法是简单地将src
文件夹复制到您的应用程序中,并将*.cc
文件添加到您的应用程序的构建系统中。
所有包含路径都是相对于src
文件夹设置的,所以您只需要将包含目录添加到src
文件夹。
有关详细信息,请参阅<tinyusdz>/CMakeLists.txt
和examples/sdlviewer/CMakeLists.txt。
TinyUSDZ在构建之前和之后(安装阶段之前)不会生成任何头文件和源文件,所以您不需要关心源代码树的任何预处理和后处理。例如,USD Ascii解析器使用手写的C++代码,所以不涉及Bison/flex/PEG处理。
不建议将tinyusdz作为git子模块使用,因为该仓库包含许多构建TinyUSDZ示例所需的代码,但这些代码对您的应用程序并不需要。
请参阅CMake构建选项
和CMakeLists.txt
。在大多数情况下,相同的标识符是从cmake构建选项定义的:例如,如果您为cmake参数指定-DTINYUSDZ_PRODUCTION_BUILD=1
,则会定义TINYUSDZ_PRODUCTION_BUILD
。
提供了CMake构建。
$ mkdir build
$ cd build
$ cmake ..
$ make
请查看scripts/bootstrap-cmake-*.sh
以了解一些构建配置。
支持Visual Studio 2019和2022。
为了方便在 Visual Studio 2019 和 Visual Studio 2022 上构建,提供了 CMakePresets.json
,但它存在许多限制(并且似乎并行构建效果不佳,导致构建速度较慢)。
如果您需要更多灵活性,建议使用通过调用 vcsetup.bat
的普通 cmake .sln
生成方法。
(在运行之前,根据需要编辑 vcsetup.bat
中的 VS 版本)
提供了使用 llvm-mingw(clang) 的 MinGW 原生和交叉编译示例。
详情请参见 scripts/bootstrap-cmake-mingw-win.sh
和 scripts/bootstrap-cmake-llvm-mingw-cross.sh
。
使用 llvm-mingw 的一个好处是支持 Windows 应用程序的地址清理器。
要运行应用程序(.exe
,您需要在工作目录或搜索路径中放置 libunwind.dll
和 libc++.dll
)
对于 Windows 原生构建,我们假设系统中已安装 ninja.exe
(您可以使用 Meson 包中的版本)
TINYUSDZ_PRODUCTION_BUILD
:生产构建。不输出调试日志。TINYUSDZ_BUILD_TESTS
:构建测试TINYUSDZ_BUILD_EXAMPLES
:构建示例(注意,并非 examples
文件夹中的所有示例都会被构建)TINYUSDZ_WITH_OPENSUBDIV
:使用 OpenSubdiv 对细分曲面进行镶嵌。
osd_DIR
cmake 环境变量指定 OpenSubdiv 的路径。TINYUSDZ_WITH_AUDIO
:支持加载音频(mp3 和 wav)。TINYUSDZ_WITH_EXR