Views
No views yet
# --- Definição de Materiais ---
mat_preto = trimesh.visual.material.SimpleMaterial(
diffuse=[20, 20, 20, 255], specular=[50, 50, 50, 255], shininess=10
)
mat_dourado = trimesh.visual.material.SimpleMaterial(
diffuse=[218, 165, 32, 255], specular=[255, 215, 0, 255], shininess=80
)
mat_branco = trimesh.visual.material.SimpleMaterial(
diffuse=[245, 245, 245, 255], specular=[255, 255, 255, 255], shininess=40
)
# Material transparente simulando acrílico/vidro
mat_transparente = trimesh.visual.material.SimpleMaterial(
diffuse=[220, 235, 255, 80], specular=[255, 255, 255, 255],
shininess=120, alphaMode='BLEND'
)
mat_cinza_escuro = trimesh.visual.material.SimpleMaterial(
diffuse=[40, 40, 40, 255]
)
meshes = []
altura_base = 1.0
# 1. BASE (Cilindro Preto)
base = trimesh.creation.cylinder(radius=3.0, height=altura_base, sections=64)
base.apply_translation([0, 0, altura_base / 2])
base.visual.material = mat_preto
meshes.append(base)
# 2. PLACA DOURADA (Caixa retangular na frente da base)
placa = trimesh.creation.box(extents=[3.6, 0.9, 0.15])
# Posiciona na parte frontal da base
placa.apply_translation([0, -2.6, altura_base + 0.35])
placa.visual.material = mat_dourado
meshes.append(placa)
# 3. CÚPULA (Cone suave simulando domo de acrílico)
cupula_raio = 2.4
cupula_altura = 2.8
cupula = trimesh.creation.cone(radius=cupula_raio, height=cupula_altura, sections=64)
cupula.apply_translation([0, 0, altura_base + cupula_altura / 2])
cupula.visual.material = mat_transparente
meshes.append(cupula)
# 4. DRONE (Corpo central)
corpo_largura, corpo_comprimento, corpo_altura = 1.0, 1.6, 0.5
corpo_z = altura_base + cupula_altura + corpo_altura / 2 + 0.3
corpo = trimesh.creation.box(extents=[corpo_largura, corpo_comprimento, corpo_altura])
corpo.apply_translation([0, 0, corpo_z])
corpo.visual.material = mat_branco
meshes.append(corpo)
# 5. GIMBAL DA CÂMERA (Cilindro cinza na frente)
cam = trimesh.creation.cylinder(radius=0.25, height=0.4, sections=32)
cam.apply_translation([0, corpo_comprimento/2 + 0.2, corpo_z - 0.1])
cam.visual.material = mat_cinza_escuro
meshes.append(cam)
# 6. BRAÇOS E MOTORES (4 braços em X)
dist_braco = 1.8
posicoes = [
[dist_braco/2, dist_braco/2], [-dist_braco/2, dist_braco/2],
[dist_braco/2, -dist_braco/2], [-dist_braco/2, -dist_braco/2]
]
for x, y in posicoes:
# Braço
angulo = np.arctan2(y, x)
braco = trimesh.creation.box(extents=[0.12, 0.12, 0.08])
rot = trimesh.transformations.rotation_matrix(angulo, [0, 0, 1])
trans = trimesh.transformations.translation_matrix([x/2, y/2, 0])
braco.apply_transform(rot @ trans)
braco.apply_translation([0, 0, corpo_z])
braco.visual.material = mat_branco
meshes.append(braco)
# Motor
motor = trimesh.creation.cylinder(radius=0.18, height=0.25, sections=16)
motor.apply_translation([x, y, corpo_z + 0.15])
motor.visual.material = mat_cinza_escuro
meshes.append(motor)
# Hélice (Caixa fina)
helice = trimesh.creation.box(extents=[1.0, 0.04, 0.015])
helice.apply_translation([x, y, corpo_z + 0.3])
helice.visual.material = mat_branco
meshes.append(helice)
# Criar cena e exportar como GLB
cena = trimesh.Scene(meshes)
dados_gl_b = cena.export(file_type='glb')
with open(filename, 'wb') as f:
f.write(dados_gl_b)
print(f"Arquivo '{filename}' criado com sucesso!")
return filename