Fast3Dcache / app.py
Mulinjushi's picture
update app
41268a6 verified
import gradio as gr
import os
# 1. Define directory paths
IMG_DIR = "example_image" # Directory for images
MODEL_DIR = "f3c" # Directory for 3D models
# 2. Automatically scan and match files
examples = []
# Check if directories exist to avoid errors
if os.path.exists(IMG_DIR) and os.path.exists(MODEL_DIR):
# Get all png images, sorted
image_files = sorted([f for f in os.listdir(IMG_DIR) if f.endswith('.png')])
for img_file in image_files:
# Get filename without extension (e.g., "6" or "typical_creature_dragon")
base_name = os.path.splitext(img_file)[0]
# Construct the expected GLB filename: rule is "filename_demo_trellis.glb"
expected_glb_name = f"{base_name}_demo_trellis.glb"
# Construct full paths
img_path = os.path.join(IMG_DIR, img_file)
glb_path = os.path.join(MODEL_DIR, expected_glb_name)
# Critical step: Only add to the list if the corresponding 3D file actually exists
if os.path.exists(glb_path):
examples.append({
"image": img_path,
"model": glb_path,
"label": base_name # Label displayed below the image
})
else:
# Print to logs if a matching model is missing (for debugging)
print(f"⚠️ Matching model not found: Image {img_file} -> Missing {expected_glb_name}")
print(f"✅ Successfully loaded {len(examples)} pairs of data")
# 3. Define click event: Return the corresponding model path
def display_model(evt: gr.SelectData):
if evt.index < len(examples):
return examples[evt.index]["model"]
return None
# 4. Build the interface
with gr.Blocks(title="3D Model Viewer") as demo:
gr.Markdown("## 3D Accelerated Instances Showcase")
gr.Markdown(f"Click on an image on the left to view the 3D effect on the right. Loaded {len(examples)} instances in total.")
with gr.Row():
# Left column: Image Gallery
with gr.Column(scale=1):
gallery = gr.Gallery(
value=[item["image"] for item in examples],
label="Instance Gallery",
columns=3, # Number of images per row
height=800, # Set height (scrollable if many images)
object_fit="contain",
allow_preview=False # Disable click-to-zoom
)
# Right column: 3D Viewer
with gr.Column(scale=2):
model_3d = gr.Model3D(
clear_color=[0.2, 0.2, 0.2, 1.0], # Dark gray background for better contrast
label="3D Interactive View",
camera_position=(0, 0, 2.5) # Adjust initial camera distance
)
# Bind interaction: Gallery click -> Update Model3D
gallery.select(fn=display_model, outputs=model_3d)
# Launch the app
if __name__ == "__main__":
# ssr_mode=False is crucial to prevent "bool is not iterable" errors in some environments
demo.launch()