Huggingface.js documentation

@huggingface/usd-web-viewer

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

@huggingface/usd-web-viewer

OpenUSD๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ: openusd(์ˆœ์ˆ˜ Rust) ๊ธฐ๋ฐ˜์˜ WebAssembly์—์„œ USD ๊ตฌ์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , three.js๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. .usd, .usda, .usdc, .usdz ํŒŒ์ผ์„ ์ฝ์œผ๋ฉฐ, ๋กœ๋”ฉ์€ Web Worker์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

npm install @huggingface/usd-web-viewer three

์‚ฌ์šฉ

์ค€๋น„๋œ ๋ทฐ์–ด(๋ Œ๋”๋Ÿฌ, ์กฐ๋ช…, ์˜ค๋น— ์ปจํŠธ๋กค):

import { createViewer } from '@huggingface/usd-web-viewer';

const viewer = createViewer(document.getElementById('viewer')); // a container element
const { info } = await viewer.load(
  'https://huggingface.co/datasets/Robotiq-Official/simready-assets/resolve/main/Robotiq_2F_85/simready_usd/Robotiq_2F_85.usda',
);

๋˜๋Š” ์ž์ฒด three.js ์žฅ๋ฉด ์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

import { loadUsd } from '@huggingface/usd-web-viewer';

const { root, complete, dispose } = await loadUsd(url);
scene.add(root); // a THREE.Group, Y-up, in meters
await complete; // textures stream in after the geometry

์˜ต์…˜

loadUsd(url, options)์™€ viewer.load(url, options)๋Š” ๋‹ค์Œ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค:

์˜ต์…˜๊ธฐ๋ณธ๊ฐ’
textures'preview''none', 'preview' (๊ธฐ๋ณธ ์ƒ‰์ƒ, ์ž‘์€ ๋ฐ์ดํ„ฐ ๋งต, ๋…ธ๋ฉ€ ๋งต ์—†์Œ) ๋˜๋Š” 'full'
maxTextureSize1024๋””์ฝ”๋”ฉ๋œ ํ…์Šค์ฒ˜์˜ ๊ธด ๋ณ€ ๊ธธ์ด(ํ”ฝ์…€)
signalAbortSignal; ๋กœ๋“œ๊ฐ€ aborted ์ฝ”๋“œ์˜ UsdLoadError๋กœ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค
onProgressstage์™€ 0์—์„œ 1 ์‚ฌ์ด์˜ ์ „์ฒด fraction์„ ์ธ์ˆ˜๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค
files๋„คํŠธ์›Œํฌ ๋Œ€์‹  ๋“œ๋กญํ•˜๊ฑฐ๋‚˜ ์„ ํƒํ•œ ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค(์•„๋ž˜ ์ฐธ์กฐ)
wasmUrl, workerUrlํŒจํ‚ค์ง€ ์˜†์—WASM ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์›Œ์ปค ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์„œ๋น™๋˜๋Š” ์œ„์น˜
maxConcurrentFetches16๋™์‹œ์— ์ง„ํ–‰ ์ค‘์ธ ์š”์ฒญ
maxLayerBytes, maxLayers768 MiB, 1024๋ ˆ์ด์–ด ๋‹ค์šด๋กœ๋“œ ์ œํ•œ
maxTextureBytes512 MiBํ…์Šค์ฒ˜ ๋‹ค์šด๋กœ๋“œ ์ œํ•œ
maxTriangles, maxInstances20M, 100,000์ตœ๋Œ€ ๋ช‡ ๊ฐœ๊ฐ€ ๊ทธ๋ ค์ง€๋Š”์ง€

createViewer(container, options)๋Š” background(๊ธฐ๋ณธ๊ฐ’์€ ํˆฌ๋ช…), onContextLost, onContextRestored(๋งˆ์ง€๋ง‰์œผ๋กœ ํ‘œ์‹œ๋œ ๋ชจ๋ธ์˜ ์žฌ๋กœ๋”ฉ๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœ๋จ)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์‹คํŒจ๋Š” code๊ฐ€ ํฌํ•จ๋œ UsdLoadError์ž…๋‹ˆ๋‹ค(aborted, fetch, compose, worker, webgl). ์ถฉ์‹คํžˆ ํ‘œ์‹œํ•  ์ˆ˜ ์—†์—ˆ๋˜ ํ•ญ๋ชฉ์€ ๋ชจ๋‘ info.warnings์— ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ต์…˜, ์˜ค๋ฅ˜ ๋ฐ ๊ฒฝ๊ณ ๋Š” ํƒ€์ž…์ด ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ํŒŒ์ผ ๋กœ๋“œ

  • ์š”์ฒญ์€ <model-viewer>์™€ ๋™์ผํ•˜๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค: ์ฟ ํ‚ค๋Š” ํŽ˜์ด์ง€ ์ž์ฒด์˜ origin(credentials: 'same-origin')์œผ๋กœ๋งŒ ์ „์†ก๋˜๋ฉฐ, ์ปค์Šคํ…€ ํ—ค๋”์™€ referrer๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ์ด์–ด์™€ ํ…์Šค์ฒ˜๋Š” http(s)๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • Web Worker์—์„œ WebAssembly๋กœ ์ปดํŒŒ์ผ๋œ Rust๋กœ ํŒŒ์‹ฑ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ๋กœ๋“œ์—๋Š” ํ•œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: maxLayerBytes(768 MiB), maxLayers(1024), maxTextureBytes(512 MiB), maxTriangles(20M), maxInstances(100,000); ์ด๋ฏธ์ง€๋Š” ํ•œ ๋ณ€ ์ตœ๋Œ€ 16384 px, ๋ฉด์  ์ตœ๋Œ€ 8192 x 8192 px; ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋Š” ์ตœ๋Œ€ 256๋‹จ๊ณ„๊นŒ์ง€ ์ค‘์ฒฉ ๊ฐ€๋Šฅ; .usdz ํ•ญ๋ชฉ์€ ๊ฐ๊ฐ ์ตœ๋Œ€ 512 MiB, ์ „์ฒด ์ตœ๋Œ€ 1 GiB์ด๋ฉฐ ์••์ถ•๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ž˜๋ชป๋œ ํ˜•์‹์˜ ํŒŒ์ผ์€ UsdLoadError์™€ ํ•จ๊ป˜ ๋กœ๋“œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ํŒŒ์ผ

<input type="file" webkitdirectory>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€์— ๋“œ๋กญํ•œ ํŒŒ์ผ์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด, ํŒจํ‚ค์ง€ ๋‚ด ๊ฒฝ๋กœ๋กœ ํ‚ค๋ฅผ ์ง€์ •ํ•˜์—ฌ files๋กœ ์ „๋‹ฌํ•˜๊ณ  ๋ฃจํŠธ ๋ ˆ์ด์–ด์˜ ํ‚ค๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”. ํŒŒ์ผ ๋‚ด ์ƒ๋Œ€ ๊ฒฝ๋กœ๋Š” ์„œ๋กœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„๋˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด ๋ณ„๋„๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ(fetch)๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

const files = new Map([...input.files].map((file) => [file.webkitRelativePath || file.name, file]));
await viewer.load('chair/simready_usd/sm_chair.usd', { files });

๋ฒˆ๋“ค๋Ÿฌ

worker์™€ WASM ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” new URL(..., import.meta.url)๋กœ ์ฐพ์œผ๋ฉฐ, Vite, webpack ๋ฐ ๊ธฐํƒ€ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ด๋ฅผ ํ•ด์„ํ•˜๊ณ  ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. Vite ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ํŒจํ‚ค์ง€๋ฅผ ์˜์กด์„ฑ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง์—์„œ ์ œ์™ธํ•˜์„ธ์š”:

// vite.config.js
export default { optimizeDeps: { exclude: ['@huggingface/usd-web-viewer'] } };

MIT ๋ผ์ด์„ ์Šค๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. WASM ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ปดํŒŒ์ผ๋œ Rust ํฌ๋ ˆ์ดํŠธ์˜ ๋ผ์ด์„ ์Šค๋Š” THIRD_PARTY_LICENSES์— ์žˆ์Šต๋‹ˆ๋‹ค.

Update on GitHub