From 04979e2af62678648a71edf572bd44680f8263cb Mon Sep 17 00:00:00 2001 From: HochCC Date: Fri, 3 Jul 2026 22:45:53 +0800 Subject: [PATCH 1/2] update --- docs/landing/assets/img/logo_horizon.png | Bin 0 -> 10926 bytes docs/landing/index.html | 1 + docs/landing/style.css | 11 ++++++++--- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 docs/landing/assets/img/logo_horizon.png diff --git a/docs/landing/assets/img/logo_horizon.png b/docs/landing/assets/img/logo_horizon.png new file mode 100644 index 0000000000000000000000000000000000000000..462d85930c6b8aa265a3b94e7e376e8dc5adb41d GIT binary patch literal 10926 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 MY8q%%s#!<;AJ2Q3F#rGn literal 0 HcmV?d00001 diff --git a/docs/landing/index.html b/docs/landing/index.html index 622f8ed..7ce856e 100644 --- a/docs/landing/index.html +++ b/docs/landing/index.html @@ -47,6 +47,7 @@ +

EmbodiedGenV2

diff --git a/docs/landing/style.css b/docs/landing/style.css index 0a15953..34afab5 100644 --- a/docs/landing/style.css +++ b/docs/landing/style.css @@ -84,14 +84,19 @@ a.nav__link:hover{color:#fff; background:rgba(255,255,255,.14);} radial-gradient(120% 90% at 50% 45%, rgba(8,9,12,.30) 0%, rgba(8,9,12,.62) 100%), linear-gradient(180deg, rgba(8,9,12,.62) 0%, rgba(8,9,12,.42) 30%, rgba(8,9,12,.46) 62%, rgba(8,9,12,.82) 100%);} /* logo floats left of the centered title; offset is clamped so it never flies off-screen */ -.hero__logo{--lx:clamp(-450px,-34vw,-330px); position:absolute; z-index:3; left:53%; top:50%; - transform:translate(var(--lx),-120px); width:clamp(128px,11vw,158px); height:auto; +.hero__logo{--lx:clamp(-448px,-33.5vw,-328px); position:absolute; z-index:3; left:53%; top:50%; + transform:translate(var(--lx),-120px); width:clamp(108px,9.5vw,136px); height:auto; filter:drop-shadow(0 6px 22px rgba(0,0,0,.4)); transition:transform .35s var(--ease-out), filter .35s ease; transform-origin:center; cursor:pointer; animation:hero-fade 1s ease .1s both;} .hero__logo:hover{transform:translate(var(--lx),-120px) scale(1.1); filter:drop-shadow(0 10px 30px rgba(0,0,0,.5));} +/* organization brand mark, stacked below the project logo */ +.hero__orglogo{--lx:clamp(-345px,-26vw,-235px); position:absolute; z-index:3; left:53%; top:50%; + transform:translate(var(--lx),96px); width:clamp(108px,9.5vw,136px); height:auto; + filter:drop-shadow(0 4px 16px rgba(0,0,0,.45)); + animation:hero-fade 1s ease .25s both;} .hero__content{position:relative; z-index:1; text-align:center; color:#fff; padding:0 var(--pad); max-width:1000px;} .hero__title{font-size:clamp(38px,6.2vw,65px); font-weight:800; letter-spacing:-.05em; line-height:.92; @@ -400,7 +405,7 @@ model-viewer{width:100%; height:100%; min-height:0; --poster-color:transparent; RESPONSIVE ========================================================= */ @media (max-width:1000px){ - .hero__logo{display:none;} + .hero__logo,.hero__orglogo{display:none;} /* single column: drop the fixed row height; stage gets its own min-height */ .viewer{grid-template-columns:1fr; grid-template-rows:none; grid-template-areas:"stage" "side" "gallery";} .viewer__stage{min-height:380px;} From 4ce6e26ac97ce1ab10cd7686483508f456819f6a Mon Sep 17 00:00:00 2001 From: HochCC Date: Tue, 7 Jul 2026 21:08:36 +0800 Subject: [PATCH 2/2] chore(docs): Update README and add affordance download. --- README.md | 9 ++- apps/image_to_3d.py | 2 +- apps/text_to_3d.py | 2 +- apps/texture_edit.py | 6 +- apps/visualize_asset.py | 85 +++++++++++++++++++++++---- docs/documentation/acknowledgement.md | 2 +- docs/documentation/index.md | 2 +- docs/documentation/install.md | 4 +- docs/landing/index.html | 4 +- embodied_gen/utils/gpt_config.yaml | 6 +- mkdocs.yml | 2 +- 11 files changed, 92 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 5143ca5..c0953e8 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ [![πŸ“– Documentation](https://img.shields.io/badge/πŸ“–-Documentation-blue)](https://horizonrobotics.github.io/EmbodiedGen/docs/) [![GitHub](https://img.shields.io/badge/GitHub-EmbodiedGen-black?logo=github)](https://github.com/HorizonRobotics/EmbodiedGen) [![πŸ“„ arXiv](https://img.shields.io/badge/πŸ“„-arXiv-b31b1b)](https://arxiv.org/abs/2506.10600) -[![πŸŽ₯ Video](https://img.shields.io/badge/πŸŽ₯-Video-red)](https://www.youtube.com/watch?v=rG4odybuJRk) +[![πŸŽ₯ Video](https://img.shields.io/badge/πŸŽ₯-Video-red)](https://youtu.be/swjDFEvjn14) [![πŸ€— Dataset](https://img.shields.io/badge/πŸ€—-Dataset-blue)](https://huggingface.co/datasets/HorizonRobotics/EmbodiedGenData) -[![中文介绍](https://img.shields.io/badge/中文介绍-07C160?logo=wechat&logoColor=white)](https://mp.weixin.qq.com/s/HH1cPBhK2xcDbyCK4BBTbw) + [![πŸ€— Hugging Face](https://img.shields.io/badge/πŸ€—-EmbodiedGen_Asset_Gallery-blue)](https://huggingface.co/spaces/HorizonRobotics/EmbodiedGen-Gallery-Explorer) [![πŸ€— Hugging Face](https://img.shields.io/badge/πŸ€—-Image_to_3D_Demo-blue)](https://huggingface.co/spaces/HorizonRobotics/EmbodiedGen-Image-to-3D) [![πŸ€— Hugging Face](https://img.shields.io/badge/πŸ€—-Text_to_3D_Demo-blue)](https://huggingface.co/spaces/HorizonRobotics/EmbodiedGen-Text-to-3D) @@ -15,7 +15,7 @@ > **From intent to executable 3D worlds.** > ***EmbodiedGen*** compiles language, images, and edit commands into **simulation-ready 3D worlds** β€” physically plausible assets, large-scale scenes, and task-driven interactive environments, deployable across every major robotics simulator. -EmbodiedGen V2 Overview +EmbodiedGen V2 Overview --- @@ -273,8 +273,7 @@ If you use EmbodiedGen in your research or projects, please cite: ## πŸ™Œ Acknowledgement EmbodiedGen builds upon the following amazing projects and models: -🌟 [Trellis](https://github.com/microsoft/TRELLIS) | 🌟 [Hunyuan-Delight](https://huggingface.co/tencent/Hunyuan3D-2/tree/main/hunyuan3d-delight-v2-0) | 🌟 [Segment Anything](https://github.com/facebookresearch/segment-anything) | 🌟 [Rembg](https://github.com/danielgatis/rembg) | 🌟 [RMBG-1.4](https://huggingface.co/briaai/RMBG-1.4) | 🌟 [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN) | 🌟 [Kolors](https://github.com/Kwai-Kolors/Kolors) | 🌟 [Aesthetic Score](http://captions.christoph-schuhmann.de/aesthetic_viz_laion_sac+logos+ava1-l14-linearMSE-en-2.37B.html) | 🌟 [Pano2Room](https://github.com/TrickyGo/Pano2Room) | 🌟 [Diffusion360](https://github.com/ArcherFMY/SD-T2I-360PanoImage) | 🌟 [Kaolin](https://github.com/NVIDIAGameWorks/kaolin) | 🌟 [diffusers](https://github.com/huggingface/diffusers) | 🌟 [gsplat](https://github.com/nerfstudio-project/gsplat) | 🌟 [ChatGPT](https://platform.openai.com/docs/models/gpt-4o) | 🌟 [SD3.5](https://huggingface.co/stabilityai/stable-diffusion-3.5-medium) | 🌟 [ManiSkill](https://github.com/haosulab/ManiSkill) | 🌟 [SAM3D](https://github.com/facebookresearch/sam-3d-objects) | 🌟 [infinigen](https://github.com/princeton-vl/infinigen) -🌟 [Trellis](https://github.com/microsoft/TRELLIS) | 🌟 [Hunyuan-Delight](https://huggingface.co/tencent/Hunyuan3D-2/tree/main/hunyuan3d-delight-v2-0) | 🌟 [Hunyuan3D-Part](https://github.com/Tencent-Hunyuan/Hunyuan3D-Part) | 🌟 [GraspGen](https://github.com/NVlabs/GraspGen) | 🌟 [Segment Anything](https://github.com/facebookresearch/segment-anything) | 🌟 [Rembg](https://github.com/danielgatis/rembg) | 🌟 [RMBG-1.4](https://huggingface.co/briaai/RMBG-1.4) | 🌟 [Stable Diffusion x4](https://huggingface.co/stabilityai/stable-diffusion-x4-upscaler) | 🌟 [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN) | 🌟 [Kolors](https://github.com/Kwai-Kolors/Kolors) | 🌟 [ChatGLM3](https://github.com/THUDM/ChatGLM3) | 🌟 [Aesthetic Score](http://captions.christoph-schuhmann.de/aesthetic_viz_laion_sac+logos+ava1-l14-linearMSE-en-2.37B.html) | 🌟 [Pano2Room](https://github.com/TrickyGo/Pano2Room) | 🌟 [Diffusion360](https://github.com/ArcherFMY/SD-T2I-360PanoImage) | 🌟 [Kaolin](https://github.com/NVIDIAGameWorks/kaolin) | 🌟 [diffusers](https://github.com/huggingface/diffusers) | 🌟 [gsplat](https://github.com/nerfstudio-project/gsplat) | 🌟 [QWEN-2.5VL](https://github.com/QwenLM/Qwen2.5-VL) | 🌟 [GPT4o](https://platform.openai.com/docs/models/gpt-4o) | 🌟 [SD3.5](https://huggingface.co/stabilityai/stable-diffusion-3.5-medium) | 🌟 [ManiSkill](https://github.com/haosulab/ManiSkill) | 🌟 [SAM3D](https://github.com/facebookresearch/sam-3d-objects) | 🌟 [infinigen](https://github.com/princeton-vl/infinigen) +🌟 [Trellis](https://github.com/microsoft/TRELLIS) | 🌟 [Hunyuan-Delight](https://huggingface.co/tencent/Hunyuan3D-2/tree/main/hunyuan3d-delight-v2-0) | 🌟 [Hunyuan3D-Part](https://github.com/Tencent-Hunyuan/Hunyuan3D-Part) | 🌟 [GraspGen](https://github.com/NVlabs/GraspGen) | 🌟 [Segment Anything](https://github.com/facebookresearch/segment-anything) | 🌟 [Rembg](https://github.com/danielgatis/rembg) | 🌟 [RMBG-1.4](https://huggingface.co/briaai/RMBG-1.4) | 🌟 [Stable Diffusion x4](https://huggingface.co/stabilityai/stable-diffusion-x4-upscaler) | 🌟 [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN) | 🌟 [Kolors](https://github.com/Kwai-Kolors/Kolors) | 🌟 [ChatGLM3](https://github.com/THUDM/ChatGLM3) | 🌟 [Aesthetic Score](http://captions.christoph-schuhmann.de/aesthetic_viz_laion_sac+logos+ava1-l14-linearMSE-en-2.37B.html) | 🌟 [Pano2Room](https://github.com/TrickyGo/Pano2Room) | 🌟 [Diffusion360](https://github.com/ArcherFMY/SD-T2I-360PanoImage) | 🌟 [Kaolin](https://github.com/NVIDIAGameWorks/kaolin) | 🌟 [diffusers](https://github.com/huggingface/diffusers) | 🌟 [gsplat](https://github.com/nerfstudio-project/gsplat) | 🌟 [QWEN-2.5VL](https://github.com/QwenLM/Qwen2.5-VL) | 🌟 [SD3.5](https://huggingface.co/stabilityai/stable-diffusion-3.5-medium) | 🌟 [ManiSkill](https://github.com/haosulab/ManiSkill) | 🌟 [SAM3D](https://github.com/facebookresearch/sam-3d-objects) | 🌟 [infinigen](https://github.com/princeton-vl/infinigen) --- diff --git a/apps/image_to_3d.py b/apps/image_to_3d.py index 09158cb..3e92b4e 100644 --- a/apps/image_to_3d.py +++ b/apps/image_to_3d.py @@ -83,7 +83,7 @@ def preprocess_example_image( πŸ’» GitHub - + πŸŽ₯ Video

diff --git a/apps/text_to_3d.py b/apps/text_to_3d.py index 3f63456..5e99073 100644 --- a/apps/text_to_3d.py +++ b/apps/text_to_3d.py @@ -63,7 +63,7 @@ πŸ’» GitHub - + πŸŽ₯ Video

diff --git a/apps/texture_edit.py b/apps/texture_edit.py index 01afe13..a03eaf4 100644 --- a/apps/texture_edit.py +++ b/apps/texture_edit.py @@ -64,15 +64,13 @@ def active_btn_by_content(mesh_content: gr.Model3D, text_content: gr.Textbox): πŸ’» GitHub - + πŸŽ₯ Video

🎨 Generate visually rich textures for 3D mesh. - """.format( - VERSION=VERSION - ), + """.format(VERSION=VERSION), elem_classes=["header"], ) diff --git a/apps/visualize_asset.py b/apps/visualize_asset.py index 4161967..b82b12a 100644 --- a/apps/visualize_asset.py +++ b/apps/visualize_asset.py @@ -56,6 +56,13 @@ HF_REPO_ID = "HorizonRobotics/EmbodiedGenData" HF_LOCAL_DIR = "EmbodiedGenData" CAMERA_ZOOM = 3.2 +# Gradio's default per-event concurrency limit is 1, which would make every +# user's HF snapshot_download (potentially several seconds) serialize behind +# whichever user clicked first. Give the HF-fetching events their own shared +# pool so several users can download/preview assets in parallel, bounded to +# avoid hammering the HF API with too many simultaneous requests. +HF_IO_CONCURRENCY_ID = "hf_asset_io" +HF_IO_CONCURRENCY_LIMIT = 6 # Compatible with huggingface space zero GPU import spaces @@ -124,6 +131,7 @@ def ensure_hf_files(rel_patterns: list[str]) -> None: css = """ .gradio-container .gradio-group { box-shadow: 0 2px 4px rgba(0,0,0,0.05) !important; } #asset-gallery { border: 1px solid #E5E7EB; border-radius: 8px; padding: 8px; background-color: #F9FAFB; } +#download-row button { white-space: nowrap; } """ lighting_css = """ @@ -724,13 +732,33 @@ def download_mjcf(asset_dir: str, req: gr.Request) -> str | None: return zip_path +def download_affordance(asset_dir: str, req: gr.Request) -> str | None: + """Package the ``affordance/`` folder.""" + if not asset_dir or not os.path.isdir(asset_dir): + gr.Warning("Please select an asset first.") + return None + + gr.Info("⏳ Preparing affordance asset for download, please wait...") + ensure_hf_files([f"{_rel_dir(asset_dir)}/affordance/**"]) + affordance_dir = os.path.join(asset_dir, "affordance") + if not os.path.isdir(affordance_dir): + gr.Warning("No affordance folder available for this asset.") + return None + + zip_path, uid, zip_name = _fmt_zip_path(asset_dir, "affordance", req) + _zip_items(zip_path, [(affordance_dir, "affordance")]) + gr.Info(f"βœ… {zip_name} is ready.") + return zip_path + + # Download buttons keyed by format; order matches the outputs list used when # locking/unlocking them together. -_DL_KEYS = ("urdf", "usd", "mjcf") +_DL_KEYS = ("urdf", "usd", "mjcf", "affordance") _DL_LABELS = { "urdf": "⬇️ Download URDF", "usd": "⬇️ Download USD", "mjcf": "⬇️ Download MJCF", + "affordance": "⬇️ Affordance", } @@ -796,7 +824,7 @@ def end_session(req: gr.Request) -> None: πŸ’» GitHub - + πŸŽ₯ Video

@@ -931,7 +959,7 @@ def end_session(req: gr.Request) -> None: urdf_file = gr.Textbox( label="URDF File Path", interactive=False, lines=2 ) - with gr.Row(): + with gr.Row(elem_id="download-row"): # DownloadButtons that build their zip into their own value # on click; a chained JS handler then triggers the browser # download from that value (one-click). If the JS ever @@ -952,6 +980,11 @@ def end_session(req: gr.Request) -> None: variant="primary", interactive=False, ) + affordance_dl_btn = gr.DownloadButton( + label="⬇️ Affordance", + variant="primary", + interactive=False, + ) search_button.click( fn=search_assets, @@ -1008,6 +1041,8 @@ def update_assets(p, s, c): gallery.select( fn=show_asset_from_gallery, inputs=[primary, secondary, category, search_box, gallery_df_state], + concurrency_id=HF_IO_CONCURRENCY_ID, + concurrency_limit=HF_IO_CONCURRENCY_LIMIT, outputs=[ (visual_path_state := gr.State()), (collision_path_state := gr.State()), @@ -1030,7 +1065,7 @@ def update_assets(p, s, c): ], ).success( fn=_reset_downloads, - outputs=[urdf_dl_btn, usd_dl_btn, mjcf_dl_btn], + outputs=[urdf_dl_btn, usd_dl_btn, mjcf_dl_btn, affordance_dl_btn], ) # After the zip is built into the button's own value, pass that file value @@ -1050,33 +1085,61 @@ def update_assets(p, s, c): } """ - dl_btns = [urdf_dl_btn, usd_dl_btn, mjcf_dl_btn] + dl_btns = [urdf_dl_btn, usd_dl_btn, mjcf_dl_btn, affordance_dl_btn] # Each flow: lock all buttons (prevent spam clicks) -> build the zip -> # JS-trigger the browser download -> unlock. Selecting another asset # resets the buttons independently (see `.success` above). urdf_dl_btn.click( - fn=lambda: _lock_downloads("urdf"), outputs=dl_btns + fn=lambda: _lock_downloads("urdf"), outputs=dl_btns, queue=False ).then( - fn=download_urdf, inputs=[asset_folder], outputs=[urdf_dl_btn] + fn=download_urdf, + inputs=[asset_folder], + outputs=[urdf_dl_btn], + concurrency_id=HF_IO_CONCURRENCY_ID, + concurrency_limit=HF_IO_CONCURRENCY_LIMIT, ).then(fn=lambda *a: None, inputs=[urdf_dl_btn], js=download_js).then( fn=_unlock_downloads, outputs=dl_btns ) - usd_dl_btn.click(fn=lambda: _lock_downloads("usd"), outputs=dl_btns).then( - fn=download_usd, inputs=[asset_folder], outputs=[usd_dl_btn] + usd_dl_btn.click( + fn=lambda: _lock_downloads("usd"), outputs=dl_btns, queue=False + ).then( + fn=download_usd, + inputs=[asset_folder], + outputs=[usd_dl_btn], + concurrency_id=HF_IO_CONCURRENCY_ID, + concurrency_limit=HF_IO_CONCURRENCY_LIMIT, ).then(fn=lambda *a: None, inputs=[usd_dl_btn], js=download_js).then( fn=_unlock_downloads, outputs=dl_btns ) mjcf_dl_btn.click( - fn=lambda: _lock_downloads("mjcf"), outputs=dl_btns + fn=lambda: _lock_downloads("mjcf"), outputs=dl_btns, queue=False ).then( - fn=download_mjcf, inputs=[asset_folder], outputs=[mjcf_dl_btn] + fn=download_mjcf, + inputs=[asset_folder], + outputs=[mjcf_dl_btn], + concurrency_id=HF_IO_CONCURRENCY_ID, + concurrency_limit=HF_IO_CONCURRENCY_LIMIT, ).then(fn=lambda *a: None, inputs=[mjcf_dl_btn], js=download_js).then( fn=_unlock_downloads, outputs=dl_btns ) + affordance_dl_btn.click( + fn=lambda: _lock_downloads("affordance"), + outputs=dl_btns, + queue=False, + ).then( + fn=download_affordance, + inputs=[asset_folder], + outputs=[affordance_dl_btn], + concurrency_id=HF_IO_CONCURRENCY_ID, + concurrency_limit=HF_IO_CONCURRENCY_LIMIT, + ).then( + fn=lambda *a: None, inputs=[affordance_dl_btn], js=download_js + ).then(fn=_unlock_downloads, outputs=dl_btns) + demo.load(start_session) demo.unload(end_session) diff --git a/docs/documentation/acknowledgement.md b/docs/documentation/acknowledgement.md index 2dd4f29..ec5a399 100644 --- a/docs/documentation/acknowledgement.md +++ b/docs/documentation/acknowledgement.md @@ -1,7 +1,7 @@ # πŸ™Œ Acknowledgement EmbodiedGen builds upon the following amazing projects and models: -🌟 [Trellis](https://github.com/microsoft/TRELLIS) | 🌟 [Hunyuan-Delight](https://huggingface.co/tencent/Hunyuan3D-2/tree/main/hunyuan3d-delight-v2-0) | 🌟 [Segment Anything](https://github.com/facebookresearch/segment-anything) | 🌟 [Rembg](https://github.com/danielgatis/rembg) | 🌟 [RMBG-1.4](https://huggingface.co/briaai/RMBG-1.4) | 🌟 [Stable Diffusion x4](https://huggingface.co/stabilityai/stable-diffusion-x4-upscaler) | 🌟 [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN) | 🌟 [Kolors](https://github.com/Kwai-Kolors/Kolors) | 🌟 [ChatGLM3](https://github.com/THUDM/ChatGLM3) | 🌟 [Aesthetic Score](http://captions.christoph-schuhmann.de/aesthetic_viz_laion_sac+logos+ava1-l14-linearMSE-en-2.37B.html) | 🌟 [Pano2Room](https://github.com/TrickyGo/Pano2Room) | 🌟 [Diffusion360](https://github.com/ArcherFMY/SD-T2I-360PanoImage) | 🌟 [Kaolin](https://github.com/NVIDIAGameWorks/kaolin) | 🌟 [diffusers](https://github.com/huggingface/diffusers) | 🌟 [gsplat](https://github.com/nerfstudio-project/gsplat) | 🌟 [QWEN-2.5VL](https://github.com/QwenLM/Qwen2.5-VL) | 🌟 [GPT4o](https://platform.openai.com/docs/models/gpt-4o) | 🌟 [SD3.5](https://huggingface.co/stabilityai/stable-diffusion-3.5-medium) | 🌟 [ManiSkill](https://github.com/haosulab/ManiSkill) | 🌟 [SAM3D](https://github.com/facebookresearch/sam-3d-objects) +🌟 [Trellis](https://github.com/microsoft/TRELLIS) | 🌟 [Hunyuan-Delight](https://huggingface.co/tencent/Hunyuan3D-2/tree/main/hunyuan3d-delight-v2-0) | 🌟 [Hunyuan3D-Part](https://github.com/Tencent-Hunyuan/Hunyuan3D-Part) | 🌟 [GraspGen](https://github.com/NVlabs/GraspGen) | 🌟 [Segment Anything](https://github.com/facebookresearch/segment-anything) | 🌟 [Rembg](https://github.com/danielgatis/rembg) | 🌟 [RMBG-1.4](https://huggingface.co/briaai/RMBG-1.4) | 🌟 [Stable Diffusion x4](https://huggingface.co/stabilityai/stable-diffusion-x4-upscaler) | 🌟 [Real-ESRGAN](https://github.com/xinntao/Real-ESRGAN) | 🌟 [Kolors](https://github.com/Kwai-Kolors/Kolors) | 🌟 [ChatGLM3](https://github.com/THUDM/ChatGLM3) | 🌟 [Aesthetic Score](http://captions.christoph-schuhmann.de/aesthetic_viz_laion_sac+logos+ava1-l14-linearMSE-en-2.37B.html) | 🌟 [Pano2Room](https://github.com/TrickyGo/Pano2Room) | 🌟 [Diffusion360](https://github.com/ArcherFMY/SD-T2I-360PanoImage) | 🌟 [Kaolin](https://github.com/NVIDIAGameWorks/kaolin) | 🌟 [diffusers](https://github.com/huggingface/diffusers) | 🌟 [gsplat](https://github.com/nerfstudio-project/gsplat) | 🌟 [QWEN-2.5VL](https://github.com/QwenLM/Qwen2.5-VL) | 🌟 [SD3.5](https://huggingface.co/stabilityai/stable-diffusion-3.5-medium) | 🌟 [ManiSkill](https://github.com/haosulab/ManiSkill) | 🌟 [SAM3D](https://github.com/facebookresearch/sam-3d-objects) | 🌟 [infinigen](https://github.com/princeton-vl/infinigen) --- diff --git a/docs/documentation/index.md b/docs/documentation/index.md index 040dba2..14b932c 100644 --- a/docs/documentation/index.md +++ b/docs/documentation/index.md @@ -9,7 +9,7 @@ hide: [![GitHub](https://img.shields.io/badge/GitHub-EmbodiedGen-black?logo=github)](https://github.com/HorizonRobotics/EmbodiedGen) [![πŸ“„ arXiv](https://img.shields.io/badge/πŸ“„-arXiv-b31b1b)](https://arxiv.org/abs/2506.10600) [![πŸ€— Dataset](https://img.shields.io/badge/πŸ€—-Dataset-blue)](https://huggingface.co/datasets/HorizonRobotics/EmbodiedGenData) -[![πŸŽ₯ Video](https://img.shields.io/badge/πŸŽ₯-Video-red)](https://www.youtube.com/watch?v=rG4odybuJRk) +[![πŸŽ₯ Video](https://img.shields.io/badge/πŸŽ₯-Video-red)](https://youtu.be/swjDFEvjn14) *EmbodiedGen V2*: An Agentic, Simulation-Ready 3D World Engine for Embodied AI. diff --git a/docs/documentation/install.md b/docs/documentation/install.md index 0c5ade1..c0100f5 100644 --- a/docs/documentation/install.md +++ b/docs/documentation/install.md @@ -38,5 +38,5 @@ Update the API key in file: `embodied_gen/utils/gpt_config.yaml`. You can choose between two backends for the GPT agent: -- **`gpt-4o`** (Recommended) – Use this if you have access to **Azure OpenAI**. -- **`qwen2.5-vl`** – An alternative with free usage via OpenRouter, apply a free key [here](https://openrouter.ai/settings/keys) and update `api_key` in `embodied_gen/utils/gpt_config.yaml` (50 free requests per day) +- **`gpt-5.4`** (or Higher, Recommended) – Use this if you have access to **Azure OpenAI**. +- **`gemma-4-31b`** – A free multimodal alternative (`google/gemma-4-31b-it:free`) via OpenRouter, apply a free key [here](https://openrouter.ai/settings/keys) and update `api_key` in `embodied_gen/utils/gpt_config.yaml`. Free-tier availability on OpenRouter can change over time β€” check the [model page](https://openrouter.ai/google/gemma-4-31b-it:free) before relying on it. diff --git a/docs/landing/index.html b/docs/landing/index.html index 7ce856e..85ba0a2 100644 --- a/docs/landing/index.html +++ b/docs/landing/index.html @@ -71,7 +71,7 @@

EmbodiedGenPaper Code - + Video HuggingFace @@ -451,7 +451,7 @@

BibTeX