Spaces:
Runtime error
Runtime error
File size: 2,604 Bytes
6f62f26 3d4bb70 6f62f26 3d4bb70 6f62f26 3d4bb70 6f62f26 3d4bb70 f1a45c5 9b2ee46 3d4bb70 f1a45c5 3d4bb70 f795533 f1a45c5 6f62f26 3d4bb70 f72b58c 6f62f26 f795533 f72b58c 6f62f26 9b2ee46 6f62f26 3d4bb70 6f62f26 3d4bb70 6f62f26 2d1ede7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
import gradio as gr
import trimesh
import numpy as np
from PIL import Image
import tempfile
def apply_rust_texture(section):
# Load the original mesh
mesh = trimesh.load('train.glb', force='mesh')
rust_texture = Image.open('rust_steel.png').convert('RGB')
# Train body selection logic
bounds = mesh.bounds
min_bounds, max_bounds = bounds[0], bounds[1]
body_height = max_bounds[2] - min_bounds[2]
body_midpoint = (max_bounds + min_bounds) / 2
# Define more sophisticated criteria for the body selection
if section == 'body':
# Assuming the body is within certain height and centered horizontally
selected_indices = np.where((mesh.vertices[:, 2] >= min_bounds[2]) &
(mesh.vertices[:, 2] <= min_bounds[2] + 0.75 * body_height) &
(mesh.vertices[:, 0] >= min_bounds[0]) &
(mesh.vertices[:, 0] <= max_bounds[0]))[0]
elif section == 'roof':
# Roof is the top quarter of the height
selected_indices = np.where(mesh.vertices[:, 2] > min_bounds[2] + 0.75 * body_height)[0]
# Ensure indices are within bounds
valid_indices = selected_indices[selected_indices < len(mesh.vertices)]
# Create or initialize UV mapping
uv = np.random.rand(len(mesh.vertices), 2)
# Apply the rust texture only to the selected indices
new_uv = np.copy(uv)
new_uv[valid_indices, :] = np.random.rand(len(valid_indices), 2)
# Create a new material with the rust texture image
material = trimesh.visual.texture.SimpleMaterial(image=rust_texture)
new_visuals = trimesh.visual.TextureVisuals(uv=new_uv, material=material)
# Create a new mesh with the updated visuals
textured_mesh = trimesh.Trimesh(vertices=mesh.vertices, faces=mesh.faces, visual=new_visuals, validate=True, process=False)
# Save the modified mesh to a temporary file for Gradio visualization
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.glb')
textured_mesh.export(temp_file.name, file_type='glb')
temp_file.close()
return temp_file.name
with gr.Blocks() as app:
gr.Markdown("### Apply Rust Texture to Train Body Section")
original_model = gr.Model3D('train.glb', label="Original Model")
modified_model = gr.Model3D(label="Textured Model")
section_dropdown = gr.Dropdown(choices=['body', 'roof'], label="Select Section")
button = gr.Button("Apply Rust Texture to Section")
button.click(apply_rust_texture, inputs=section_dropdown, outputs=modified_model)
app.launch()
|