bioops-twin / create_model.py
BioOps Team
fix(critical): RAG-powered mock agent + reliable 3D model loading
51b9259
Raw
History Blame Contribute Delete
3.38 kB
import math
import os
def create_centrifuge_model():
assets_dir = "assets"
os.makedirs(assets_dir, exist_ok=True)
obj_path = os.path.join(assets_dir, "centrifuge_rotor_new.obj")
mtl_path = os.path.join(assets_dir, "centrifuge_rotor_new.mtl")
# Create Material file
with open(mtl_path, "w") as f:
f.write("# Material for BioOps Centrifuge\n")
f.write("newmtl MetalRotor\n")
f.write("Ka 0.2 0.2 0.2\n") # Ambient
f.write("Kd 0.7 0.7 0.8\n") # Diffuse (greyish blue metal)
f.write("Ks 0.9 0.9 0.9\n") # Specular
f.write("Ns 100.0\n") # Shininess
f.write("d 1.0\n") # Opaqueness
f.write("illum 2\n")
f.write("\nnewmtl RedTube\n")
f.write("Ka 0.2 0.0 0.0\n")
f.write("Kd 0.8 0.1 0.1\n")
f.write("Ks 0.5 0.5 0.5\n")
f.write("Ns 50.0\n")
f.write("d 1.0\n")
f.write("illum 2\n")
# Create OBJ file
with open(obj_path, "w") as f:
f.write("mtllib centrifuge_rotor_new.mtl\n")
# We will build a central cylinder and a few smaller cylinders for tubes
vertices = []
faces = []
def add_cylinder(r, h, offset_x=0, offset_y=0, offset_z=0, segments=32, material="MetalRotor"):
start_v = len(vertices) + 1
# Vertices
for i in range(segments):
angle = 2 * math.pi * i / segments
x = r * math.cos(angle) + offset_x
z = r * math.sin(angle) + offset_z
vertices.append((x, offset_y + h, z))
vertices.append((x, offset_y, z))
# Center top and bottom
vertices.append((offset_x, offset_y + h, offset_z))
top_center = len(vertices)
vertices.append((offset_x, offset_y, offset_z))
bottom_center = len(vertices)
f.write(f"usemtl {material}\n")
# Faces
for i in range(segments):
next_i = (i + 1) % segments
t1 = start_v + i * 2
b1 = start_v + i * 2 + 1
t2 = start_v + next_i * 2
b2 = start_v + next_i * 2 + 1
# Side
faces.append((t1, b1, b2))
faces.append((t1, b2, t2))
# Top
faces.append((top_center, t2, t1))
# Bottom
faces.append((bottom_center, b1, b2))
# Add main rotor
add_cylinder(r=1.5, h=0.5, offset_y=-0.25, segments=32, material="MetalRotor")
# Add central hub
add_cylinder(r=0.3, h=0.8, offset_y=-0.25, segments=16, material="MetalRotor")
# Add 6 tubes
for i in range(6):
angle = 2 * math.pi * i / 6
x = 1.0 * math.cos(angle)
z = 1.0 * math.sin(angle)
add_cylinder(r=0.15, h=0.6, offset_x=x, offset_y=0, offset_z=z, segments=12, material="RedTube")
# Write vertices
for v in vertices:
f.write(f"v {v[0]:.4f} {v[1]:.4f} {v[2]:.4f}\n")
# Write faces
for face in faces:
f.write(f"f {face[0]} {face[1]} {face[2]}\n")
print(f"Created {obj_path} and {mtl_path}")
create_centrifuge_model()